【问题标题】:Check file extension before uploading file in asp.net web api在 asp.net web api 中上传文件之前检查文件扩展名
【发布时间】:2013-11-25 11:47:38
【问题描述】:

这是我的任务:

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

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

  3. 我需要将文件作为 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-&gt;resize-&gt;save new-&gt;deleteold?

【问题讨论】:

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


    【解决方案1】:

    我不知道如何检查文件扩展名,因为我无法覆盖方法 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 列表等缺失部分,它对其他复制粘贴者没有多大用处
    猜你喜欢
    • 2013-01-28
    • 2021-07-13
    • 1970-01-01
    • 2020-02-04
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    相关资源
    最近更新 更多