【问题标题】:Managing user-uploaded files with an ASP.NET website and Visual Studio使用 ASP.NET 网站和 Visual Studio 管理用户上传的文件
【发布时间】:2012-02-20 22:55:43
【问题描述】:

我知道在互联网历史上的某个地方一定有人问过这个问题,但我似乎无法确定正确的术语来获得我需要的答案。这个问题很接近:What is the best way to store user uploaded files in a website? 但我需要更多细节。

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

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

1) 我们如何在数据库中保存路径?绝对?相对? 每个用户都有一个“ProfilePicPath”列。如果我们想将整个项目从一台服务器完全连根拔起到另一台服务器,并且由于某种原因我们不能将文件放在新服务器上的相同位置怎么办?每个链接都会断开。

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

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

需要明确的是,我们的需求很小 --- 这只是一个供内部使用的小项目,可能不超过 30 个用户,并且所有内容都需要包含在一台 IIS 7 服务器上。

【问题讨论】:

    标签: asp.net security project-management


    【解决方案1】:

    1) 我们如何在数据库中保存路径?绝对?相对的?每个用户都有一个“ProfilePicPath”列。如果我们想将整个项目从一台服务器完全连根拔起到另一台服务器,并且由于某种原因我们不能将文件放在新服务器上的相同位置怎么办?每个链接都会断开。

    亲戚。如果您希望这样做,只需在 ProfilePicPath 中存储文件名。我有一个 Web 应用程序,我发现将图片存储在数据类型为“图像”的 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 处理程序,例如&lt;img src="Pic.ashx" /&gt;。下面是我用来从数据库中获取图像的代码,但是如果您从 a 文件夹中获取数据,则可以使用 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
    }
    

    【讨论】:

      【解决方案2】:

      我对 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 的个人资料寻找照片时 我会像这样称呼我的班级

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

      【讨论】:

        猜你喜欢
        • 2013-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2015-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多