禁用直接访问图像

时间:2012-01-02 23:54:43

标签: c# asp.net imaging

我正在制作一个小家庭相册,打算稍后将其打开给其他人存储图像。

我将图像上传到〜\ images \,然后调整它们3次(普通视图...缩略图和小版本)并将它们移动到〜\ images \ thumbs,〜\ images \ normal,〜\ images \微小,然后将原件移动到〜\ images \ original。

如果用户知道文件名,他们只需转到http://mysite.com/images/normal/filename.jpg即可直接访问。

我宁愿不让他们使用。

那么,有没有办法改变asp:Image控件的ImageUrl,而不是从不可访问的文件夹中读取?这会是一次性能打击吗?我正在考虑(不确定是否可能)将图像读入Steam,并以某种方式设置ImageUrl或者什么,从流中读取?

希望你能提供帮助。

2 个答案:

答案 0 :(得分:9)

答案是肯定的。您可以使用特殊格式的img src,它将图像直接嵌入页面中。

您可以使用以下格式代替网址:

<img src="data:image/png;base64,..." />

其中data指定图像的mime类型,而base64之后的...是图像的base64编码内容。

此行为由this RFC定义。

以下是一个例子:

在HTML中:

<img id="MyPicture" runat="server" border="0" />

在代码隐藏中:

    protected void Page_Load(object sender, EventArgs e)
    {
        MyPicture.Src = @"data:image/gif;base64," + EncodeFile(Server.MapPath(@"/images/test.gif"));
    }

    private string EncodeFile(string fileName)
    {
        return Convert.ToBase64String(File.ReadAllBytes(fileName));
    }

答案 1 :(得分:0)

我建议考虑一下这样的事情:

  1. 将图像保存到“siteroot / images / userid /".
  2. 等文件夹中
  3. 成功登录后,设置会话变量,以便其他页面知道当前用户已登录。Session["user"] = youruser;您在会话变量中存储的任何对象都包含从数据库中提取的有效youruser.userID
  4. 在您网站根目录的Global.asax文件中添加以下内容:
  5. (未经测试的代码)

    void Begin_Request(object sender, EventArgs e)
    {
        //Protect /images/ folder for all requests
        if (Request.FilePath.Contains("images"))
        {
            YourUser user = Session["user"];
    
            if(user == null) {
                Server.Transfer("404.aspx"); //Folder not public
            }
    
            if (!Request.FilePath.Contains("images/" + user.userID.toString())){
                Server.Transfer("404.aspx"); //This is not current user's image folder
            }
    
        }
    }
    
    除非他们找出图像文件的直接路径,否则这应该有效地拒绝所有人,除了他们各自的“图像”文件夹的正确用户。

    如果有人有任何方法可以改进这种方法,请随时发表评论,因为我很快会在网站上实现这个想法,并且总是欢迎第二种意见。