gpt4 book ai didi

azure - 通过 Web api 将文件上传到 Azure blob

转载 作者:行者123 更新时间:2023-12-03 03:17:37 30 4
gpt4 key购买 nike

我正在尝试找出一种通过 Web API 上传文件的方法,而无需将整个文件保存到磁盘或内存中。

这是我的 API Controller 代码:

public async Task<IHttpActionResult>Post([FromUri] string ext) 
{
string fileName = string.Concat(Guid.NewGuid(), ext);
var blob = AzureBlobContainer.GetBlockBlobReference(fileName);
await blob.UploadFromStream(await Request.Content.ReadAsStreamAsync()); // here is the issue
return Ok();
}

我正在使用 HttpClient 进行上传:

public async Task<bool> Upload(string requestUrl, Stream fileStream)
{
var progress = new ProgressMessageHandler();
progress.HttpSendProgress += HttpSendProgress;
var client = HttpClientFactory.Create(progress);
HttpResponseMessage response = await client.PostAsync(requestUrl, new StreamContent(fileStream));
response.EnsureSuccessStatusCode();
return response.IsSuccessStatusCode;
}

private void HttpSendProgress(object sender, HttpProgressEventArgs e)
{
Debug.WriteLine("progress is {0}% ({1} of {2})", e.ProgressPercentage, e.BytesTransferred, e.TotalBytes);
}

此代码将成功将文件上传到 Azure。然而,整个文件正在 Web api 服务器上缓冲,然后复制到 Azure。这会导致在文件上传到 api Controller 时来自进度事件的消息计数达到 100%,然后在文件上传到 Azure 时出现阻塞。我明白,因为我使用的是 StreamContent,所以 Web api 不应缓冲我的上传。

这个问题讨论了一个解决方案,这让我认为这是可能的:WebAPI Request Streaming support

我的客户端代码位于可移植类库中,因此无法对 Azure .net 存储库产生任何依赖(因此我无法直接上传到 Azure,除非使用底层 REST API)

最佳答案

正如您提供的链接中所讨论的,您需要在您的服务中将缓冲策略设置为非缓冲模式,因为默认情况下该策略是缓冲。

StreamContent 可以保存缓冲流或非缓冲流,并且它不决定主机上的请求流是否应该缓冲。做出这个决定的是托管层。

关于azure - 通过 Web api 将文件上传到 Azure blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21326551/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com