Asp.net mvc 将文件附加/上载到尚未保存的便笺中-这方面的最佳策略是什么?

Asp.net mvc 将文件附加/上载到尚未保存的便笺中-这方面的最佳策略是什么?,asp.net-mvc,asp.net-mvc-4,azure,file-upload,asp.net-web-api,Asp.net Mvc,Asp.net Mvc 4,Azure,File Upload,Asp.net Web Api,在我的应用程序中,我有一个textarea输入,用户可以在其中键入注释。 当他们单击Save时,会有一个对WebAPI的AJAX调用,将注释保存到数据库中 我希望用户能够在保存便笺之前将多个文件附加到此便笺(Gmail样式)。这将是很好的,如果上传可以开始尽快附加,然后再保存说明 这方面的最佳策略是什么 另外,我不能使用jQuery fineuploader插件或类似的东西,因为在上传到Azure之前,我需要在服务器上为文件指定唯一的名称 我试图做的是可能的,还是我必须让整个“注释”成为一个普通

在我的应用程序中,我有一个textarea输入,用户可以在其中键入注释。 当他们单击Save时,会有一个对WebAPI的AJAX调用,将注释保存到数据库中

我希望用户能够在保存便笺之前将多个文件附加到此便笺(Gmail样式)。这将是很好的,如果上传可以开始尽快附加,然后再保存说明

这方面的最佳策略是什么

另外,我不能使用jQuery fineuploader插件或类似的东西,因为在上传到Azure之前,我需要在服务器上为文件指定唯一的名称

我试图做的是可能的,还是我必须让整个“注释”成为一个普通的表单post而不是一个API调用


谢谢

这种方法是基于文件的,但是如果您愿意,可以将相同的逻辑应用于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
当用户发帖子并且我确认所有验证都已通过时,我只需将文件复制到已完成的文件夹中,并使用新生成的便笺ID:

C:\NodeUploads\Note-100001\file1.txt
然后删除
C:\TemporaryUploads\UNIQUE-USER-GUID
文件夹

清理

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

  • 让后台服务定期清理这些文件。每日、每周等。这应该是Azure的Web作业的作业
  • 每次保存新便笺时,通过web应用程序清理旧文件。这不是一个很好的方法,因为您在执行文件IO时可能没有要删除的文件

  • 这种方法是基于文件的,但如果您愿意,可以将相同的逻辑应用于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
    
    当用户发帖子并且我确认所有验证都已通过时,我只需将文件复制到已完成的文件夹中,并使用新生成的便笺ID:

    C:\NodeUploads\Note-100001\file1.txt
    
    然后删除
    C:\TemporaryUploads\UNIQUE-USER-GUID
    文件夹

    清理

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

  • 让后台服务定期清理这些文件。每日、每周等。这应该是Azure的Web作业的作业
  • 每次保存新便笺时,通过web应用程序清理旧文件。这不是一个很好的方法,因为您在执行文件IO时可能没有要删除的文件

  • 基于RGraham的回答,您可以采取另一种方法:

    • 创建用于存储便笺附件的blob容器。我们称之为
      注意附件
    • 当用户进入创建便笺的屏幕时,为便笺指定GUID
    • 当用户上传文件时,您只需在文件名前加上此注释id。因此,如果用户上传文件,比如
      file1.txt
      ,它将作为
      note attachments/{note id}/file1.txt
      保存到blob存储中
    • 根据您的要求,保存便笺后,您可以将此blob移动到另一个blob容器中或仅保留在此处。由于blob的名称中有noteid,因此搜索注释的附件很容易
    对于上传文件,我建议使用
    AJAX
    CORS
    共享访问签名
    直接从浏览器上传到blob存储。这样可以避免数据通过服务器传输。您可能会发现这些博客文章很有用:


    基于RGraham的答案,您可以采取另一种方法:

    • 创建用于存储便笺附件的blob容器。我们称之为
      注意附件
    • 当用户进入创建便笺的屏幕时,为便笺指定GUID
    • 当用户上传文件时,您只需在文件名前加上此注释id。因此,如果用户上传文件,比如
      file1.txt
      ,它将作为
      note attachments/{note id}/file1.txt
      保存到blob存储中
    • 根据您的要求,保存便笺后,您可以将此blob移动到另一个blob容器中或仅保留在此处。由于blob的名称中有noteid,因此搜索注释的附件很容易
    对于上传文件,我建议使用
    AJAX
    CORS
    共享访问签名
    直接从浏览器上传到blob存储。这样可以避免数据通过服务器传输。您可能会发现这些博客文章很有用:


    这似乎是一个很好的解决方案。我唯一担心的是开销,因为我的添加便笺表单位于一个人的“详细信息”页面上,多个用户会经常同时访问该页面,因此每当有人查看该页面时,我的应用程序都必须在Azure上为临时位置创建容器。有什么建议吗?再次感谢。我想我可以将添加附件表单移动到一个弹出窗口,并在弹出窗口中显示表单之前触发一个AJAX事件来创建容器。或者您可以在第一个AJAX请求中创建容器?是否可以为任何后续请求返回唯一Id?此外,由于这只是临时存储,您甚至可能不必使用blob存储。只是本地web存储只要您不希望有大量的请求,我可以在创建帐户时为“帐户”创建一个临时容器,然后