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

本文关键字:文件 扩展名 检查 net asp web api | 更新日期: 2024-05-04 15:07:18

这是我的任务:

  1. 我需要使用Asp.Netwebapi将内存上传到服务器。

  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->resize->save new->delete老?

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

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