Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net web api中上载文件之前,请检查文件扩展名_C#_Asp.net_Asp.net Web Api - Fatal编程技术网

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后,我可以

我的任务是:

  • 我需要使用Asp.NETWebAPI将Images上载到服务器

  • 我需要检查文件的扩展名,然后再上传它(我想只允许上传图片)

  • 我需要以流或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
    将文件保存到指定的文件夹中,并且不返回流,如果我想调整它的大小,我需要从硬盘读取它,调整大小,另存为新文件并删除旧文件

    另一个变体是使用
    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列表之类的缺失部分,它对其他复制粘贴程序没有多大用处