2012-02-17 110 views
1

我知道在互联网历史的某个地方,这个地方肯定有问题,但我似乎无法确定正确的术语来获取回答我的需要。这个问题很近:What is the best way to store user uploaded files in a website?但我需要更多的细节。用ASP.NET网站和Visual Studio管理用户上传的文件

基本上,你应该如何有效地管理用户上传的文件,例如个人资料照片?我想知道的是关于WHERE制作目录结构的一些“最佳实践”。

上述问题的第二个答案提供了一些选项,例如将它们存储在之外的网页根目录,这正是我最初想到的。但后来我开始思考......

1)我们如何保存数据库中的路径?绝对?相对?每个用户都有一个“ProfilePicPath”列。如果我们想要将整个项目从一台服务器完全拔除到另一台服务器上,并且出于任何原因,我们无法将这些文件放在新服务器上的相同位置?每一个环节都会被打破。

2)应如何处理安全问题?假设我们已将我们的Web应用程序部署为喜欢C:\ websites \ site1,但我们将用户个人资料图片存储在类似C:\ usercontent \ profilepictures \中?在我们加载配置文件图片的页面上,我们如何安全地在后面的代码中以编程方式访问该代码?我们不想把它们放在像C:\ websites \ site1 \ usercontent \ profilepictures \中,对吗?我不喜欢将绝对路径放入数据库,我也不想在后面的代码中的任何位置硬编码路径。

我们最初尝试使用Web项目中的文件,但随后它变成了一种风险,因为这些用户文件是我们项目的一部分。更新/修改网站时,一次错误的复制/粘贴,我们可能会覆盖用户上次从存储库中检出项目后上传的文件等。这是一个巨大的麻烦,整个场景只是向我尖叫,“你这个白痴,你这样做都是错误的......“但我似乎无法找到一个合适的指导来做这件事”是正确的“。

要清楚的是,我们的需求是最小的 - 这只是一个小型项目供内部使用,不超过30个用户,并且全部需要包含在一个IIS 7服务器上。

回答

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 
} 
+0

你是我的英雄。谢谢! – CptSupermrkt 2012-02-21 00:05:50

1

我做了我的Web Site

  1. 我创建了一个子域的地方,我可以访问这些文件(如static.domain.com)
  2. 在我的主网站,我加了一些的appSettings在web.config像这些

    <add key="MainPath" value="http://static.domain.com/ImageDatabase/" /> 
        <add key="Profile" value="Profile/" />   
        <add key="Advertisements" value="Ads/" />   
    
  3. 的文件路径,我创建一个返回可怕的一类ctory我需要得到一个特定的文件。 我将我的文件序列化为链接到我的数据库中具有名称为 photo_1的配置文件。PNG 其例如可能在档案目录中找到 所以当即时寻找相片为帐户ID的概要1 我只会叫我的课像这些

string ProfileDir = clsDirectory.GetProfileDirectory(); 

string filePath = ProfileDir + "photo_" + UserId + ".png"; 
相关问题