我知道在互联网历史的某个地方,这肯定是在某个地方被问到的,但我似乎无法确定正确的术语以获得我需要的答案。这个问题很接近:What is the best way to store user uploaded files in a website?但我需要更多细节。
基本上,您应该如何有效管理用户上传的文件,例如个人资料图片?我想知道的是关于WHERE制作目录结构的一些“最佳实践”。
上述问题中的第二个答案提供了一些选项,例如将它们存储在Web根目录的之外,这是我最初的想法。但后来我开始思考......
1)我们如何保存数据库中的路径?绝对?相对?每个用户都有一个“ProfilePicPath”列。如果我们想要将整个项目从一个服务器完全拔除到另一个服务器,并且由于某种原因我们无法将文件放在新服务器上的相同位置,该怎么办?每个环节都会被打破。
2)如何在安全性方面进行处理?假设我们将Web应用程序部署为C:\ websites \ site1,但我们将用户个人资料图片存储在C:\中usercontent \ profilepictures \?在我们加载个人资料图片的页面上,我们如何在后面的代码中以编程方式安全地访问它?我们不想把它们放在C:\ websites \ site1 \ usercontent \ profilepictures \中,对吗?我不喜欢将绝对路径放入数据库,我也不想在后面的代码中的任何地方对路径进行硬编码。
我们最初DID尝试使用Web项目中的文件,但随后它变成了一种风险,因为这些用户文件是我们项目的一部分。更新/修改站点时有一个错误的复制/粘贴,我们可能会覆盖用户上次从存储库中检出项目后上传的文件等。这是一个很大的麻烦,整个场景只是尖叫着我,“你是白痴,你这样做是错的......“但我似乎无法找到一个正确的指导来做到这一点。”
为了清楚起见,我们的需求很小 - 这只是一个供内部使用的小项目,不超过30个用户,而且它们都需要包含在一台IIS 7服务器上。
答案 0 :(得分:2)
1)我们如何保存数据库中的路径?绝对?相对?每个用户都有一个“ProfilePicPath”列。如果我们想要将整个项目从一个服务器完全拔除到另一个服务器,并且由于某种原因我们无法将文件放在新服务器上的相同位置,该怎么办?每个环节都会被打破。
相对。在ProfilePicPath中,如果您希望以这种方式执行,只需存储文件名。我有一个Web应用程序,我发现将图片存储在数据类型为“image”的SQL列中更容易。原因是图片是应用程序数据的一部分而不是应用程序的代码,因此将其存储在数据库中。
2)如何在安全方面处理这个问题?假设我们将Web应用程序部署为C:\ websites \ site1,但我们将用户个人资料图片存储在C:\ usercontent \ profilepictures \?中在我们加载个人资料图片的页面上,我们如何在后面的代码中以编程方式安全地访问它?我们不想把它们放在C:\ websites \ site1 \ usercontent \ profilepictures \中,对吗?我不喜欢将绝对路径放入数据库,我也不想在后面的代码中的任何地方对路径进行硬编码。
在你的web.config中有一个像这样的appSetting:
<add key="ProfilePicturePath" value="C:\usercontent\profilepictures\" />
您的代码可以使用Path.Combine(s1, s2)
将AppSetting与用户的数据库ProfilePicPath值组合在一起。要提供图像文件,您可以引用HTTP处理程序,例如<img src="Pic.ashx" />
。我用来从数据库中获取图像的代码如下所示,但如果您从文件夹中获取数据,则可以使用System.IO.File.Open()
来从文件系统获取流。
public class Pic : IHttpHandler
{
#region Properties
public bool IsReusable
{
get
{
return true;
}
}
#endregion
#region Implemented Interfaces
#region IHttpHandler
public void ProcessRequest(HttpContext context)
{
var userRecord = DAL.GetCurrentUser();
if (userRecord != null)
{
byte[] picture = userRecord.ProfilePicture.ToArray();
context.Response.ContentType = "image/jpeg";
context.Response.OutputStream.Write(picture, 0, picture.Length);
context.Response.OutputStream.Close();
}
}
#endregion
#endregion
}
答案 1 :(得分:1)
我对Web Site
做了什么在我的主网站上,我在web.config中为这些文件路径添加了一些appSettings
<add key="MainPath" value="http://static.domain.com/ImageDatabase/" />
<add key="Profile" value="Profile/" />
<add key="Advertisements" value="Ads/" />
我创建了一个返回目录的类,我需要获取一个特定的文件。 我将我的文件序列化为链接到我的数据库中具有名称的配置文件 photo_1.png 例如,可以在“配置文件目录”下找到它 所以当我为帐户ID 1的个人资料寻找照片时 我会像这样打电话给我的班级
string ProfileDir = clsDirectory.GetProfileDirectory(); string filePath = ProfileDir + "photo_" + UserId + ".png";