在asp.net web api中上传文件之前检查文件扩展名

时间:2013-11-25 11:47:38

标签: c# asp.net asp.net-web-api

这是我的任务:

  1. 我需要使用Asp.Net web api将immages上传到服务器。

  2. 我需要在上传之前检查文件的扩展名(我想只允许上传immages)。

  3. 我需要将文件作为Stream或Base64String获取,因为我想在保存到服务器之前调整它的大小。

  4. 这是我尝试过的。 我可以使用MultipartFormDataStreamProvider将文件上传到服务器,并且在我CustomMultipartFormDataStreamProvider中隐藏了MultipartFormDataStreamProvider之后,我能够在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 - 在这里我可以获得一个Stream:

    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

    有没有办法在上传文件之前检查文件扩展名并将文件作为Stream获取而不是将其保存到光盘。或唯一的方法是save->resize->save new->delete老?

1 个答案:

答案 0 :(得分:4)

  

我不知道如何检查文件扩展名,因为我无法覆盖方法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;
    }
}