使用ASP.NET网站和Visual Studio管理用户上载的文件

时间:2012-02-17 05:42:07

标签: asp.net security project-management

我知道在互联网历史的某个地方,这肯定是在某个地方被问到的,但我似乎无法确定正确的术语以获得我需要的答案。这个问题很接近: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服务器上。

2 个答案:

答案 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

做了什么
  1. 我创建了一个子域,我可以访问文件(例如static.domain.com)
  2. 在我的主网站上,我在web.config中为这些文件路径添加了一些appSettings

       <add key="MainPath" value="http://static.domain.com/ImageDatabase/" />
       <add key="Profile" value="Profile/" />         
       <add key="Advertisements" value="Ads/" />         
    
  3. 我创建了一个返回目录的类,我需要获取一个特定的文件。 我将我的文件序列化为链接到我的数据库中具有名称的配置文件 photo_1.png 例如,可以在“配置文件目录”下找到它 所以当我为帐户ID 1的个人资料寻找照片时 我会像这样打电话给我的班级

  4. string ProfileDir = clsDirectory.GetProfileDirectory();
    
    string filePath = ProfileDir + "photo_" + UserId + ".png";