0

在我的應用程序中,我有一個textarea輸入,用戶可以在其中輸入筆記。 當他們點擊保存時,會有一個AJAX調用Web Api將註釋保存到數據庫中。將文件附加/上傳至尚未保存注 - 此策略的最佳策略是什麼?

我希望用戶能夠在保存備註之前將多個文件附加到本筆記(Gmail樣式)中。如果上傳可以在保存筆記之前立即開始,那將會很好。

這是最好的策略是什麼?

P.S.我無法使用jQuery fineuploader插件或類似的東西,因爲我需要在將服務器上傳到Azure之前在服務器上提供這些文件的唯一名稱。

是我試圖做的可能,還是我必須使整個'注意'一個正常的形式後,而不是一個API調用?

謝謝!

回答

1

此方法基於文件,但如果您願意,您可以將相同的邏輯應用於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 Jobs的工作
  2. 每次保存新筆記時都通過Web應用程序清理舊文件。不是一個偉大的方法,因爲你在做文件IO時,有可能沒有要刪除的文件
+0

這似乎是一個很好的解決方案。我唯一擔心的就是開銷,因爲我的添加註釋表單位於一個人的「詳細信息」頁面上,這個頁面會同時被多個用戶頻繁訪問,所以我的應用程序將不斷地在Azure上創建Containers以獲取臨時位置每當有人查看該頁面時。對此有何建議?再次感謝。 – 502502

+0

我想我可以將添加附件表單移動到一個彈出窗口中,然後在顯示彈出窗體之前觸發AJAX事件來創建容器。 – 502502

+0

或者您可以在第一個AJAX請求上創建容器?這可能會返回任何後續請求的唯一ID?此外,由於這只是臨時存儲,您甚至可能不需要使用blob存儲。只要您不需要大量的請求,就可以訪問本地網絡存儲 – CodingIntrigue

2

大廈RGraham的答案,這裏是另一種方法,你可以採取:

  • 存儲筆記創建BLOB容器附件。我們稱之爲note-attachments
  • 當用戶進入創建筆記的屏幕時,爲筆記指定一個GUID。
  • 當用戶上傳文件時,您只需在文件名前添加該備註ID即可。所以如果用戶上傳一個文件,如file1.txt,它會被保存到blob存儲中,如note-attachments/{note id}/file1.txt
  • 根據您的要求,一旦保存了筆記,您可以將此筆移動到另一個blob容器或僅保留在此處。由於blob的名稱中包含註釋ID,因此爲註釋搜索附件很容易。

對於上傳的文件,我建議直接從瀏覽器做它Blob存儲利用的AJAXCORSShared Access Signature。這樣你將避免數據通過你的服務器。您可能會發現這些博客文章有用: