【发布时间】:2014-01-24 07:10:02
【问题描述】:
我正在尝试找出一种通过 web api 上传文件的方法,而不必将整个文件保存到磁盘或内存中。
这是我的 api 控制器代码:
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 控制器时计数高达 100%,然后在文件上传到 Azure 时显示为阻塞。 我知道因为我使用的是 StreamContent,所以 web api 不应该缓冲我的上传。
在这个问题中讨论了一个解决方案,这让我觉得这是可能的:WebAPI Request Streaming support
我的客户端代码在一个可移植的类库中,所以不能对 Azure .net 存储库有任何依赖(所以我不能直接上传到 Azure,除非我使用底层 REST API)
【问题讨论】:
-
它是 Windows Phone 8/Windows 8 应用程序吗?我问的原因是因为如果是这样的话,可能还有其他选择。
-
这个想法是使用一个可移植的类库,所以它被设计用于任何一个。
标签: azure file-upload asp.net-web-api