【发布时间】:2013-11-25 11:47:38
【问题描述】:
这是我的任务:
我需要使用 Asp.Net web api 将图像上传到服务器。
我需要在上传之前检查文件的扩展名(我希望只允许上传图像)。
我需要将文件作为 Stream 或 Base64String 获取,因为我想在保存到服务器之前调整它的大小。
这是我尝试过的。
我能够使用MultipartFormDataStreamProvider 将文件上传到服务器,并且在我从MultipartFormDataStreamProvider 继承了我的CustomMultipartFormDataStreamProvider 之后,我能够在GetStream 方法中检查文件扩展名,例如:
public override Stream GetStream(HttpContent parent, System.Net.Http.Headers.HttpContentHeaders headers)
{
if (!String.IsNullOrEmpty(headers.ContentDisposition.FileName))
{
var fileExtension = CommonUtils.GetFileExtension(headers.ContentDisposition.FileName);
if (_allowedExtensions != null && !_allowedExtensions.Contains(fileExtension.ToLower()))
{
return Stream.Null;
}
}
return base.GetStream(parent, headers);
}
但是MultipartFormDataStreamProvider将文件保存到指定的文件夹并没有返回Stream,如果我想调整它的大小,我需要从HDD读取它,调整大小,另存为新文件并删除旧文件。
另一个变体是使用MultipartMemoryStreamProvider - 这里我可以得到一个流:
var task = Request.Content.ReadAsMultipartAsync<MultipartMemoryStreamProvider>(new MultipartMemoryStreamProvider())
.ContinueWith<HttpResponseMessage>((tsk) =>
{
MultipartMemoryStreamProvider provider = tsk.Result;
Stream stream = provider.Contents[0].ReadAsStreamAsync().Result;
String imageBase64 = Convert.ToBase64String(CommonUtils.StreamToByteArray(stream));
......
}
但是对于MultipartMemoryStreamProvider,我不知道如何检查文件扩展名,因为我无法覆盖方法 GetStream
有没有办法在上传文件之前检查文件扩展名并将文件作为流而不是将其保存到光盘。还是唯一的办法就是save->resize->save new->deleteold?
【问题讨论】:
标签: c# asp.net asp.net-web-api