我正在嘗試通過 HTTP 將檔案上傳到 blob 容器。
根據請求通過以下方式接收檔案:
public class UploadFileFunction
{
//Own created wrapper on BlobContainerClient
private readonly IBlobFileStorageClient _blobFileStorageClient;
public UploadFileFunction(IBlobFileStorageClient blobFileStorageClient)
{
_blobFileStorageClient = blobFileStorageClient;
}
[FunctionName("UploadFile")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "/equipments/{route}")]
HttpRequest request,
[FromRoute] string route)
{
IFormFile file = request.Form.Files["File"];
if (file is null)
{
return new BadRequestResult();
}
string fileNamePath = $"{route}_{request.Query["fileName"]}_{request.Query["fileType"]}";
BlobClient blob = _blobFileStorageClient.Container.GetBlobClient(fileNamePath);
try
{
await blob.UploadAsync(file.OpenReadStream(), new BlobHttpHeaders { ContentType = file.ContentType });
}
catch (Exception)
{
return new ConflictResult();
}
return new OkResult();
}
}
比用檔案提出請求:

在 UploadAsync 上,檔案的整個流被上傳到行程記憶體中

是否存在某種方式可以直接上傳到 blob 而無需在行程記憶體中上傳?先感謝您。
uj5u.com熱心網友回復:
避免這種情況的最佳方法是根本不通過您自己的 HTTP 端點上傳檔案。詢問如何避免上傳的資料沒有結束在行程記憶體中(通過 HTTP 端點)是沒有意義的。
只需使用Azure Blob 存盤 REST API直接將此檔案上傳到 Azure Blob 存盤。您自己的 HTTP 端點只需為檔案上傳發出共享訪問簽名 (SAS)令牌,客戶端就可以將檔案直接上傳到 Blob 存盤。
除非您有充分的理由不這樣做,否則應將此模式用于檔案上傳。您的觸發器函式僅在 HTTPRunTime 完成 HTTP 請求后呼叫,因此觸發器的 HttpRequest 物件在行程記憶體中分配,然后將其傳遞給觸發器。
如果您想分多個階段上傳,我還建議使用塊 blob 。
uj5u.com熱心網友回復:
這是 UploadAsync 作業的默認方式,這對于小檔案來說是可以的。我遇到了大檔案的記憶體不足問題;這里的解決方案是使用AppendBlobAsync
您需要將 blob 創建為附加 blob,以便您可以繼續附加到 blob 的末尾。基本要點是:
- 創建附加 blob
- 瀏覽現有檔案并一次抓取 xMB(比如 2 MB)塊
- 將這些塊附加到附加 blob 直到檔案末尾
偽代碼如下
var appendBlobClient = _blobFileStorageClient.GetAppendBlobClient(fileNamePath);
await appendBlobClient.CreateIfNotExistsAsync();
var appendBlobMaxAppendBlockBytes = appendBlobClient.AppendBlobMaxAppendBlockBytes;
using (var file = file.OpenReadStream())
{
int bytesRead;
var buffer = new byte[appendBlobMaxAppendBlockBytes];
while ((bytesRead = file.Read(buffer, 0, buffer.Length)) > 0)
{
//Stream stream = new MemoryStream(buffer);
var newArray = new Span<byte>(buffer, 0, bytesRead).ToArray();
Stream stream = new MemoryStream(newArray);
stream.Position = 0;
appendBlobClient.AppendBlock(stream);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/506691.html
標籤:C# 。网 天蓝色 天蓝色函数 天蓝色 blob 存储
