C# 在asp.net web api中上载文件之前,请检查文件扩展名
我的任务是:C# 在asp.net web api中上载文件之前,请检查文件扩展名,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我的任务是: 我需要使用Asp.NETWebAPI将Images上载到服务器 我需要检查文件的扩展名,然后再上传它(我想只允许上传图片) 我需要以流或Base64String的形式获取文件,因为我想在保存到服务器之前调整其大小 这是我试过的。 我可以使用MultipartFormDataStreamProvider将文件上载到服务器,并且在从该MultipartFormDataStreamProvider导入我的CustomMultipartFormDataStreamProvider后,我可以
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
将文件保存到指定的文件夹中,并且不返回流,如果我想调整它的大小,我需要从硬盘读取它,调整大小,另存为新文件并删除旧文件
另一个变体是使用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));
......
}
var task=Request.Content.ReadAsMultipartAsync(新的MultipartMemoryStreamProvider())
.ContinueWith((tsk)=>
{
MultipartMemoryStreamProvider provider=tsk.Result;
Stream=provider.Contents[0]。ReadAsStreamAsync().Result;
String imageBase64=Convert.ToBase64String(CommonUtils.StreamToByteArray(stream));
......
}
但是使用MultipartMemoryStreamProvider
我不知道如何检查文件扩展名,因为我无法覆盖方法GetStream
是否有一种方法可以在上传文件之前检查文件扩展名,并将文件作为流而不是保存到光盘中。或者唯一的方法是save->resize->save new->delete
old
我不知道如何检查文件扩展名,因为我无法重写方法GetStream
这是为什么?没有什么能阻止您重写GetStream
例如:
public class ImageOnlyMultipartMemoryStreamProvider : MultipartMemoryStreamProvider
{
public override Stream GetStream(HttpContent parent, HttpContentHeaders headers)
{
var fileExtension = CommonUtils.GetFileExtension(headers.ContentDisposition.FileName);
return _allowedExtensions == null || _allowedExtensions.Any(i => i.Equals(fileExtension , StringComparison.InvariantCultureIgnoreCase)) ? base.GetStream(parent, headers) : Stream.Null;
}
}
谢谢!似乎没有什么能阻止我重写。也许,当我第一次尝试重写它时,我犯了一些错误。无论如何,也许这段代码对其他任何人都有用。@IliyaKrinchiyan,如果没有CommonUtils类和_allowedExtensions列表之类的缺失部分,它对其他复制粘贴程序没有多大用处