【问题标题】:Secret image path in WebForms applicationWebForms 应用程序中的秘密图像路径
【发布时间】:2014-08-08 07:36:00
【问题描述】:

我正在使用 Visual Studio 2008 (.NET framework 3.5),目前我正在使用 C# 将图像上传到我的 ASP.NET WebForms 应用程序。如果有人复制我的图片 url 并在新窗口/标签中打开,那么我的网站的完整目录结构就会显示给用户,例如 http://domain.name/images/companylogo/logo599.jpg
我想隐藏我的目录结构并显示图像路径,例如:

http://www.zameen.com/common/resize.php?img=4/303088.jpg&d=&w=250&h=147&r=1 http://www.zameen.com/common/resize.php?img=7/165/bhurbun_continental_apartments_380.jpg&d=250&w=250&h=180&r=1 http://www.zameen.com/common/resize.php?img=2/156050.jpg&d=80&m=1

为了隐藏我的站点目录结构,我配置了 imageshack API 来上传图片,但要求类似于上面的路径。我不知道如何管理上述路径格式。

【问题讨论】:

    标签: c# asp.net webforms .net-3.5


    【解决方案1】:

    您需要将图像放在用户无法访问的文件夹中,并通过处理程序提供图像。要使该文件夹无法访问,您可以在该文件夹中放置一个 web.config 文件,其内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <system.webServer>
            <handlers>
                <add name="DenyAll" path="*.*" verb="*" 
                     type="System.Web.HttpForbiddenHandler" />
            </handlers>
        </system.webServer>
    </configuration>
    

    然后在您的项目中添加Generic Handler (*.ashx) 并执行以下操作:

    public class FileHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            var path = GetPath(context.Request.Params["Id"]);
            context.Response.ContentType = "image/jpeg";
            context.Response.WriteFile(path);
        }
    }
    

    【讨论】:

    • 感谢@chrfin 的及时回复。实际上,我网站的用户可以发布图片。那么您建议的配置的结果是什么。我对处理程序一无所知。
    • 图像来自“哪里”并不重要。如果您将它们放在带有web.config 的文件夹中,就像在我的示例中一样,它们无法直接访问,您需要获取path 以某种方式为它们提供服务 - 就像将它们存储在数据库中。
    【解决方案2】:

    最简单的方法是创建一个 .ashx 处理程序来处理对图像的请求。而不是调用

    http://domain.name/images/companylogo/logo599.jpg
    

    你可以使用

    http://domain.name/photo.ashx?id=599
    

    代码示例:http://www.dotnetperls.com/ashx

    如果您使用 imageshack API 或任何其他东西来调整大小等,或者图像位于远程服务器上,那么您可以编写您的处理程序,如 C# - Loading remote image and sending to browser using .ashx file 所示

    【讨论】:

      【解决方案3】:

      这不是一个精确的实现,这只是一个想法。获得它的步骤。

      1. 创建表(数据库)或 xml 文件以创建图像的唯一 ID 和路径。
      2. 喜欢 ID=1 和 path="~/folder/file.jpg"。
      3. 创建一个通用处理程序,它将提供图像作为响应。
      4. 如果您必须使用代码 1 "imagehandler?id=1" 调用图像,请使用这样的图像路径

      图像处理程序如下

       public class ImageHandler : IHttpHandler
       {
          public void ProcessRequest(HttpContext context)
          {
              var imageId = QueryString.getValueOf("ID");
              var imagePath="";//calculate for database or xml file
              var originalImage = Image.FromFile (context.Server.MapPath(imagePath);
              originalImage.Save(context.Response.OutputStream, ImageFormat.Jpeg);  
              context.Response.ContentType = "image/gif"; //or any type
           }
        }
      

      并将图像路径提供给带有图像 ID 的处理程序。

      一些有用的链接

      1. http://www.codeproject.com/Articles/126421/Image-Handling-In-ASP-NET
      2. http://www.dotnetperls.com/ashx

      【讨论】:

      • @shekhar 你能给我一个演示链接以获得详细说明吗?你谈论的事情对我来说是新的。
      【解决方案4】:

      最后我找到了一些符合我要求的东西。检查下面的链接,可能对某人有帮助。 http://blog.kurtschindler.net/using-httphandlers-to-serve-image-files/

      【讨论】:

        猜你喜欢
        • 2020-11-05
        • 1970-01-01
        • 1970-01-01
        • 2020-06-04
        • 1970-01-01
        • 1970-01-01
        • 2023-03-11
        • 2011-02-28
        • 1970-01-01
        相关资源
        最近更新 更多