我正在制作一个小家庭相册,打算稍后将其打开给其他人存储图像。
我将图像上传到〜\ images \,然后调整它们3次(普通视图...缩略图和小版本)并将它们移动到〜\ images \ thumbs,〜\ images \ normal,〜\ images \微小,然后将原件移动到〜\ images \ original。
如果用户知道文件名,他们只需转到http://mysite.com/images/normal/filename.jpg即可直接访问。
我宁愿不让他们使用。
那么,有没有办法改变asp:Image控件的ImageUrl,而不是从不可访问的文件夹中读取?这会是一次性能打击吗?我正在考虑(不确定是否可能)将图像读入Steam,并以某种方式设置ImageUrl或者什么,从流中读取?
希望你能提供帮助。
答案 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)
我建议考虑一下这样的事情:
Session["user"] = youruser;
您在会话变量中存储的任何对象都包含从数据库中提取的有效youruser.userID (未经测试的代码)
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
}
}
}
除非他们找出图像文件的直接路径,否则这应该有效地拒绝所有人,除了他们各自的“图像”文件夹的正确用户。
如果有人有任何方法可以改进这种方法,请随时发表评论,因为我很快会在网站上实现这个想法,并且总是欢迎第二种意见。