Asp.net mvc asp.net网站应在何处保存上载的文件,以及如何为这些文件创建下载链接?

Asp.net mvc asp.net网站应在何处保存上载的文件,以及如何为这些文件创建下载链接?,asp.net-mvc,file-upload,download,Asp.net Mvc,File Upload,Download,我有一个使用MVC框架的asp.net web应用程序,该网站允许注册者上传一些身份证明文件 我想要上传这些文档的最佳选项: 选项1-在网站文件夹中创建一个目录,并将其名称保存在website web.config文件中,并将文档文件名保存在我的数据库中,因此,当我要撰写下载链接时,我必须将根url、文件夹名称和 文档文件名 比如说+ “/DoucmentsFolder”+ “/Documentfilename” 选项2-将整个文件保存在数据库中,每次我需要下载文件时,我都必须将其保存到临时文

我有一个使用MVC框架的asp.net web应用程序,该网站允许注册者上传一些身份证明文件

我想要上传这些文档的最佳选项:

  • 选项1-在网站文件夹中创建一个目录,并将其名称保存在website web.config文件中,并将文档文件名保存在我的数据库中,因此,当我要撰写下载链接时,我必须将根url、文件夹名称和 文档文件名

    比如说+ “/DoucmentsFolder”+ “/Documentfilename”

  • 选项2-将整个文件保存在数据库中,每次我需要下载文件时,我都必须将其保存到临时文件夹并创建指向该文件的链接,并确保在用户获得该文件后删除该文件
  • 也许你还有其他建议

谢谢

使用文件存储存在多个问题:

1) 清理-您需要将文件留在那里足够长的时间,以便请求和收集,但如何清理?如果你不这样做,你就有耗尽空间的风险。最好的方法是每隔一段时间运行一次计划任务,并删除一个小时以上的文件——但这仍然很麻烦

2) 无法很好地扩展—除非您写入SAN—在web garden/farm场景中,用户对文件的请求可能会到达与存储该文件的服务器不同的服务器—除非您约束您的系统以强制来自用户的所有请求使用同一服务器

3) 未执行-与数据库操作相比

所以我可以肯定地说是数据库——这比你们所描述的要容易得多

不创建文件及其链接,而是将文件作为FileContentResult返回:

 public FileContentResult GetFile(int fileId)
{
        myFile MyFile = fileRepository.Get(fileId);
        return MyFile(file.Data, file.MimeType);
    }
}
其中MyFile看起来像:

 public class MyFile
 {
    public MyFile(byte[] fileData, string mimeType)
    {
       this.FileData = fileData;
       this.MimeType = mimeType;
    }

    public virtual int Id {get; private set;}
    public virtual byte[] FileData { get; set; }
    public virtual string MimeType { get; set; }
}
存储文件

 [HttpPost]
 public ActionResult SaveFile(HttpPostedFileBase userFile)
 {
    MyFile myFile = new MyFile(new byte[userFile.ContentLength], userFile.ContentType)
    userFile.InputStream.Read(MyFile.FileData, 0, userFile.ContentLength);

    fileRepository.Save(myFile);

 }

使用文件存储存在多个问题:

1) 清理-您需要将文件留在那里足够长的时间,以便请求和收集,但如何清理?如果你不这样做,你就有耗尽空间的风险。最好的方法是每隔一段时间运行一次计划任务,并删除一个小时以上的文件——但这仍然很麻烦

2) 无法很好地扩展—除非您写入SAN—在web garden/farm场景中,用户对文件的请求可能会到达与存储该文件的服务器不同的服务器—除非您约束您的系统以强制来自用户的所有请求使用同一服务器

3) 未执行-与数据库操作相比

所以我可以肯定地说是数据库——这比你们所描述的要容易得多

不创建文件及其链接,而是将文件作为FileContentResult返回:

 public FileContentResult GetFile(int fileId)
{
        myFile MyFile = fileRepository.Get(fileId);
        return MyFile(file.Data, file.MimeType);
    }
}
其中MyFile看起来像:

 public class MyFile
 {
    public MyFile(byte[] fileData, string mimeType)
    {
       this.FileData = fileData;
       this.MimeType = mimeType;
    }

    public virtual int Id {get; private set;}
    public virtual byte[] FileData { get; set; }
    public virtual string MimeType { get; set; }
}
存储文件

 [HttpPost]
 public ActionResult SaveFile(HttpPostedFileBase userFile)
 {
    MyFile myFile = new MyFile(new byte[userFile.ContentLength], userFile.ContentType)
    userFile.InputStream.Read(MyFile.FileData, 0, userFile.ContentLength);

    fileRepository.Save(myFile);

 }

很好的解决方案,但我想知道如何确保只有上传文件的人才能下载??我想检查已登录的用户,这要求我在文件信息中保存文件所有者的ID。只需扩展MyFile的定义以包括userId(或Role!),然后您就可以查询userId是否匹配,或者用户是否处于Role等。很好的解决方案,但我想知道如何确保只有上传文件的人才能下载??我想检查已登录的用户,这要求我在文件信息中保存文件所有者的ID。只需扩展MyFile的定义以包括userId(或Role!),然后您就可以查询userId是否匹配,或者用户是否处于Role等。。