簡體   English   中英

如何通過Azure功能上傳大文件?

[英]How to upload a large file through an Azure function?

我正在探索Azure功能。 到目前為止我測試過的場景效果很好。

我正試圖找出一種通過Azure功能上傳文件(20MB +)的方法。

我們的想法是,Azure功能將首先驗證經過身份驗證的用戶是否可以在保留請求的流並將其保存到BLOB存儲之前上載文件。

以下是客戶端的代碼,它創建一個StreamContent來將字節傳輸到服務器:

using (Stream fileStream = ...)
{
    var streamContent = new StreamContent(fileStream);

    streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    streamContent.Headers.ContentLength = fileStream.Length;
    streamContent.Headers.Add("FileId", fileId);

    var responseMessage = await m_httpClient.PutAsync(<validURI>, streamContent);

    responseMessage.EnsureSuccessStatusCode();

    succeeded = true;
}

這是服務器端的代碼。

[FunctionName("upload-data")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "put")]HttpRequestMessage req, TraceWriter log)
{
    try
    {
         //  Initialize stuff.

         //  Validate authenticated user & privileges.  

         //  Get the content stream of the request and 
         //  save it in the BLOB storage.

         return req.CreateResponse(HttpStatusCode.OK);
    }
    catch (Exception exc)
    {
        return req.CreateResponse(HttpStatusCode.InternalServerError, exc);
    }
}

我在方法的開頭放了一個斷點。 無論文件有多大,我都希望在客戶端發送請求后立即點擊斷點。 但事實並非如此。

我猜測Azure函數在調用方法之前試圖獲取請求主體的所有內容。 我還認為我發送的文件可能超過了底層Web作業的4 MB限制,但我沒有看到配置它的方法。

是否可以通過流式傳輸將大文件上傳到Azure功能? 有沒有辦法讓這項工作?

我找到了另一種做事方式。 這是適合我的解決方案。

當客戶端需要上傳文件時,它會調用Azure功能進行身份驗證(使用框架提供的身份)並授權(它可以是表存儲中的簡單有針對性的檢查,這意味着他允許執行這樣的操作)。

Azure功能將要求共享訪問簽名來訪問特定Blob。 SAS將允許客戶端在限定時間內以只寫權限訪問Blob存儲(注意Azure上的時鍾偏差)。

然后,客戶端將使用返回的SAS將文件直接上載到Blob存儲。 這樣,它避免了Afzaal Ahmad Zeeshan提到的與客戶端的長期通信,並且由於Azure功能不再依賴於客戶端的連接速度,因此降低了總體成本。

你跟隨一個不好的做法,Kzrystof。 Azure功能不適用於與客戶端設備的長期通信。 我不確定,為什么有人可能有興趣指導您編寫一個程序來管理Azure功能並強制它執行它不打算做的事情。

大型,長時間運行的功能可能會導致意外的超時問題。

現在想象一下,你可能有一個良好的互聯網連接,但用戶可能不是。 還有其他一些問題,你必須先注意一下。 這是官方文檔的摘錄, https://docs.microsoft.com/en-us/azure/azure-functions/functions-best-practices

如果我必須設計此應用程序,我將使用App Service→Azure Storage→Azure Functions。 這將是我的應用程序架構的工作流程。

在設計方法中,我的應用程序會輪流處理這些信息,例如App Service可以處理圖像上傳,在那里我可以指定用戶是否可以上傳。 可以使用ASP.NET Core或任何其他語言或框架來開發Web應用程序的那一面,並且您知道可以輕松升級它以支持最多20MB的文件上載。

我為什么要求你扭曲設計? 你有一個Blob函數,我建議使用Blob函數,因為,

如果可能,函數應該是無狀態的和冪等的。 將任何所需的狀態信息與您的數據相關聯。 例如,正在處理的訂單可能具有關聯的州成員。 函數可以基於該狀態處理訂單,而函數本身保持無狀態。

該功能本身是無狀態的,這意味着它們一定不能保留任何東西的任何信息和解決,這將需要你有其他的中間件(或frontware)與身份的服務器進行通信,這就是為什么我建議使用應用服務這里因為它可以包含驗證用戶的必要信息,然后Blob和&rarr finally函數, 如果需要的話

然后,一旦它離開那里,進入Azure存儲,然后我就可以擁有WebHooks,或者直接Blob存儲觸發器從那里處理委托並處理Azure功能中的圖像 - 如果需要功能了。 看一下Blob存儲觸發器如何用於啟動各種用途的函數, https://docs.microsoft.com/en-us/azure/azure-functions/functions-create-storage-blob-triggered-功能

設置ContentLength標頭后,您將不再對其進行流式傳輸。 您需要使用PushStreamContent類並以塊的形式寫入流。

您是否仍然能夠以服務器端訪問該流作為塊,我不知道。 Azure函數管道中的某些內容可能會在將流提供給函數之前緩沖流。

另一種解決方案(可能不是最佳實踐)是使用塊來發布文件。 但是它需要你跟蹤這些塊並在之后合並它們。

例如:

  • 前端 - 向端點發送多個塊(多個POST)
  • 后端 - 存儲塊
  • 前端 - 發送完成后,使用端點確認
  • 后端 - 合並塊

Dropzone JS - Chunking

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM