2017-08-16 48 views
0

在Azure blob上載中,如果您上載具有相同文件名的新文件(位於同一容器中),則會覆蓋該文件。如果存在blob名稱,Azure blob上傳重命名

我想在保存之前重命名新文件,以避免覆蓋任何文件 - 這可能嗎?

場景:

  1. 上傳文件 「image.jpg的」 到容器 「myContainer中」
  2. 上傳文件 「image.jpg的」 到容器 「myContainer中」(與不同的內容)
  3. 重命名第二「 Image.png「保存爲」mycontainer「之前,將其保存爲」Image_ {guid} .jpg「。

回答

0

你不能重命名blob(沒有API)。您的選擇:

  • 檢查,如果BLOB名稱存在,之前上傳,並選擇適合您不同的名稱有關將要上傳的blob如果該名稱已在使用
  • 模擬通過複製重命名現有的BLOB不同名稱的新斑塊,然後刪除原始的BLOB

由於@juunas在評論中指出:你得來管理您的工作流程,以避免關於檢查生存潛在的競爭條件,重命名等

+1

其他圖像有不同的*內容*,而不是上下文:)我也在考慮檢查是否存在,但不會在那裏遇到一個微小的競爭條件? – juunas

+0

Ohhhh - 哎呀。 :)就競爭條件而言:OP需要通過他們的應用程序來管理它(例如某種類型的隊列管道)。而且,這種競賽狀況的真實可能性是什麼? (只有OP可以回答...)。據此編輯答案。 –

0

我建議在客戶端庫中使用「If-None-Match:*」條件標頭(有時稱爲「If-Not-Exists」)。如果在PutBlob或PutBlockList操作中包含此標頭,則調用將失敗並且數據不會被覆蓋。您可以捕獲該客戶端並重試上傳操作(使用不同的Blob名稱)。

與檢查blob是否存在於上傳之前相比,這有兩個優點。首先,你不再有潛在的競爭條件。其次,調用Exists()會增加很多額外的開銷 - 每次上傳都需要額外的HTTP調用,除非您的blob非常大或延遲無關緊要,否則這種調用非常重要。通過訪問條件,當名稱發生衝突時,您只需要多次呼叫,這應該是罕見的情況。

當然,總是使用GUID可能會更容易/更乾淨,那麼您不必擔心它。