【发布时间】:2019-06-27 14:19:55
【问题描述】:
我创建了一个 Web API,允许用户发送文件并上传到 Azure 存储。它的工作方式是,客户端应用程序将连接到 API 以将一个或多个文件发送到文件上传控制器,而控制器将负责诸如
- 将文件上传到 Azure 存储
- 更新数据库
效果很好,但我认为这不是正确的方法,因为现在我可以看到有两个不同的过程
- 将文件从客户端的文件系统上传到我的 Web API(服务器)
- 从 API(服务器)上传文件到 Azure 存储
这让我觉得我正在复制上传过程,因为同一个文件首先从客户端(文件系统)传输到 API(服务器),然后是 Azure(目标)。我觉得需要向客户端显示两个进度条以获取文件上传进度(从客户端到服务器,然后从服务器到 Azure)——这对我来说没有意义,我觉得我的方法不正确。
我的 API 最多接受 250MB,因此您可以想象过载。
你们觉得呢?
//// API 控制器
if (!Request.Content.IsMimeMultipartContent("form-data"))
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
var provider = new RestrictiveMultipartMemoryStreamProvider();
var contents = await Request.Content.ReadAsMultipartAsync(provider);
int Total_Files = contents.Contents.Count();
foreach (HttpContent ctnt in contents.Contents)
{
await storageManager.AddBlob(ctnt)
}
////// 流
#region SteamHelper
public class RestrictiveMultipartMemoryStreamProvider : MultipartMemoryStreamProvider
{
public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
{
var extensions = new[] { "pdf", "doc", "docx", "cab", "zip" };
var filename = headers.ContentDisposition.FileName.Replace("\"", string.Empty);
if (filename.IndexOf('.') < 0)
return Stream.Null;
var extension = filename.Split('.').Last();
return extensions.Any(i => i.Equals(extension, StringComparison.InvariantCultureIgnoreCase))
? base.GetStream(parent, headers)
: Stream.Null;
}
}
#endregion SteamHelper
///// AddBlob
public async Task<string> AddBlob(HttpContent _Payload)
{
CloudStorageAccount cloudStorageAccount = KeyVault.AzureStorage.GetConnectionString();
CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference("SomeContainer");
cloudBlobContainer.CreateIfNotExists();
try
{
byte[] fileContentBytes = _Payload.ReadAsByteArrayAsync().Result;
CloudBlockBlob blob = cloudBlobContainer.GetBlockBlobReference("SomeBlob");
blob.Properties.ContentType = _Payload.Headers.ContentType.MediaType;
blob.UploadFromByteArray(fileContentBytes, 0, fileContentBytes.Length);
var B = await blob.CreateSnapshotAsync();
B.FetchAttributes();
return "Snapshot ETAG: " + B.Properties.ETag.Replace("\"", "");
}
catch (Exception X)
{
return ($"Error : " + X.Message);
}
}
【问题讨论】:
-
使用流怎么样?
-
嗨,我用代码更新了问题,是的,我正在使用 Stream
标签: azure asp.net-web-api azure-storage