首页 文章

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

提问于
浏览
3

这是我的任务:

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

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

  • 我需要将文件作为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 - 在这里我可以获得一个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 回答

  • 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;
        }
    }
    

相关问题