加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 来自HttpRequestMessage内容的文件名

发布时间:2020-12-16 07:19:05 所属栏目:asp.Net 来源:网络整理
导读:我实现了一个POST Rest服务来将文件上传到我的服务器.我现在的问题是我想按类型限制上传的文件.比方说,我只想允许上传.pdf文件. 我试图做的是 TaskStream task = this.Request.Content.ReadAsStreamAsync(); task.Wait(); FileStream requestStream = (FileS
我实现了一个POST Rest服务来将文件上传到我的服务器.我现在的问题是我想按类型限制上传的文件.比方说,我只想允许上传.pdf文件.

我试图做的是

Task<Stream> task = this.Request.Content.ReadAsStreamAsync();
            task.Wait();
            FileStream requestStream = (FileStream)task.Result;

但不幸的是,它无法将Stream转换为FileStream并通过requestStream.Name访问该类型.

是否有一种简单的方法(除了将流写入磁盘并检查类型)以获取文件类型?

解决方法

如果您将文件上传到Web API并且想要访问文件数据(Content-Disposition),则应将文件上载为MIME multipart(multipart / form-data).

Here我展示了一些如何从HTML表单,Javascript和.NET上传的例子.

然后你可以做这样的事情,这个例子只检查pdf / doc文件:

public async Task<HttpResponseMessage> Post()
    {
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable,"This request is not properly formatted - not multipart."));
        }

        var provider = new RestrictiveMultipartMemoryStreamProvider();

        //READ CONTENTS OF REQUEST TO MEMORY WITHOUT FLUSHING TO DISK
        await Request.Content.ReadAsMultipartAsync(provider);

        foreach (HttpContent ctnt in provider.Contents)
        {
            //now read individual part into STREAM
            var stream = await ctnt.ReadAsStreamAsync();

            if (stream.Length != 0)
            {
                using (var ms = new MemoryStream())
                {
                    //do something with the file memorystream
                }
            }
        }
        return Request.CreateResponse(HttpStatusCode.OK);
    }
}

public class RestrictiveMultipartMemoryStreamProvider : MultipartMemoryStreamProvider
{
    public override Stream GetStream(HttpContent parent,HttpContentHeaders headers)
    {
        var extensions = new[] {"pdf","doc"};
        var filename = headers.ContentDisposition.FileName.Replace(""",string.Empty);

        if (filename.IndexOf('.') < 0)
            return Stream.Null;

        var extension = filename.Split('.').Last();

        return extensions.Any(i => i.Equals(extension,StringComparison.InvariantCultureIgnoreCase))
                   ? base.GetStream(parent,headers)
                   : Stream.Null;

    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读