将文件附加/上传到尚未保存的注意 - 对此最佳策略是什么?

时间:2014-03-28 15:56:16

标签: asp.net-mvc asp.net-mvc-4 azure file-upload asp.net-web-api

在我的应用程序中,我有一个textarea输入,用户可以在其中输入注释。 当他们单击“保存”时,会对Web Api进行AJAX调用,将该注释保存到数据库中。

我希望用户能够在保存笔记之前将多个文件附加到此笔记(Gmail样式)。如果在保存笔记之前上传可以在附加后立即开始,那将是很好的。

最佳策略是什么?

P.S。我不能使用jQuery fineuploader插件或类似的东西,因为我需要在服务器上为文件提供唯一的名称,然后再将它们上传到Azure。

我正在尝试做什么,或者我是否必须将整个'Note'作为普通表单帖子而不是API调用?

谢谢!

2 个答案:

答案 0 :(得分:2)

此方法基于文件,但如果您愿意,可以将相同的逻辑应用于Azure Blob存储容器。

我通常做的是在获取AddNote页面时为用户提供唯一的GUID。我创建了一个名为:

的文件夹
C:\TemporaryUploads\UNIQUE-USER-GUID\

然后,用户在此阶段上传的所有文件都将分配到此文件夹:

C:\TemporaryUploads\UNIQUE-USER-GUID\file1.txt
C:\TemporaryUploads\UNIQUE-USER-GUID\file2.txt
C:\TemporaryUploads\UNIQUE-USER-GUID\file3.txt

当用户执行POST并且我已确认所有验证都已通过时,我只需使用新生成的注释ID将文件复制到已完成的文件夹:

C:\NodeUploads\Note-100001\file1.txt

然后删除C:\TemporaryUploads\UNIQUE-USER-GUID文件夹

清理

现在。对于那些真正开始并保存笔记的用户来说,这一切都很好,但那些上传文件并关闭浏览器的用户呢?在这个阶段有两种选择:

  1. 让后台服务按计划清理这些文件。每日,每周等。这应该是Azure的Web作业
  2. 的工作
  3. 每次保存新笔记时,都会通过网络应用程序清理旧文件。当您可能没有要删除的文件时,正在执行文件IO时,这不是一个很好的方法

答案 1 :(得分:2)

在RGraham的回答基础上,您可以采取另一种方法:

  • 创建用于存储备注附件的Blob容器。我们称之为note-attachments
  • 当用户进入创建记事的屏幕时,为记事分配GUID。
  • 当用户上传文件时,您只需在文件名前加上此注释ID。因此,如果用户上传的文件为file1.txt,则会将其作为note-attachments/{note id}/file1.txt保存到blob存储空间中。
  • 根据您的要求,一旦您保存了笔记,您可以将此blob移动到另一个blob容器或仅将其保留在此处。由于blob的名称中包含note id,因此搜索附注的附件很容易。

对于上传文件,我建议直接从浏览器使用AJAXCORSShared Access Signature进行blob存储。这样您就可以避免数据通过服务器。您可能会发现这些博客文章很有用: