webapi读取上传的文件流

逻辑说明

这里未引用System.Web.Mvc。
主要使用MultipartMemoryStreamProvider对象从Request中获取文件流。

var provider = new MultipartMemoryStreamProvider();
await Request.Content.ReadAsMultipartAsync(provider);
var items = provider.Contents.Where(c => c.Headers.ContentDisposition.FileName != null);

这里读取到的是所有带有文件名的http内容。

完整代码

扩展ApiController方法。

public static class ApiExtensions
{
    public async static Task<FormFileCollection> ReadFileCollectionAsync(this ApiController apiController)
    {
        var provider = new MultipartMemoryStreamProvider();
        await apiController.Request.Content.ReadAsMultipartAsync(provider);
        var items = provider.Contents.Where(c => c.Headers.ContentDisposition.FileName != null);
        FormFileCollection files = new FormFileCollection();
        foreach (var item in items)
        {
            var disposition = item.Headers.ContentDisposition;
            FormFile file = new FormFile(disposition.Name.Trim('"'), disposition.FileName.Trim('"'), item.Headers.ContentType.MediaType, await item.ReadAsStreamAsync(), item.Headers.ContentLength ?? 0);
            files.Add(file);
        }
        return files;
    }

    public static FormFileCollection ReadFileCollection(this ApiController apiController)
    {
        using (var t = ReadFileCollectionAsync(apiController))
        {
            t.Wait();
            return t.Result;
        }
    }
}

使用方法:

public IHttpActionResult Upload()
{
    var dir = "/upload/file";
    var dirPath = HostingEnvironment.MapPath(dir);
    if (!Directory.Exists(dirPath))
    {
        Directory.CreateDirectory(dirPath);
    }
    var files = this.ReadFileCollection();
    var fileA = files["filea"];
    fileA.SaveAs(Path.Combine(dirPath, fileA.FileName));
    var fileD = files["filed"];
    fileD.SaveAs(Path.Combine(dirPath, fileD.FileName));
    return Ok();
}

FormFile类:

public class FormFile
{
    public FormFile(string name, string fileName, string contentType, Stream stream, long size)
    {
        this.Name = name;
        this.FileName = fileName;
        this.ContentType = contentType;
        this.Stream = stream;
        this.Size = size;
    }

    public string Name { get; private set; }
    public string FileName { get; private set; }
    public string ContentType { get; private set; }
    public long Size { get; private set; }
    public Stream Stream { get; private set; }

    public virtual void SaveAs(string filename)
    {
        using (var fileStream = new FileStream(filename, FileMode.Create))
        {
            byte[] buffer = new byte[4096];
            while (true)
            {
                int num = this.Stream.Read(buffer, 0, buffer.Length);
                if (num == 0)
                {
                    break;
                }
                fileStream.Write(buffer, 0, num);
            }
            fileStream.Flush();
        }
    }
}

FormFileCollection类:

public class FormFileCollection : IEnumerable<FormFile>
{
    readonly List<FormFile> files = new List<FormFile>();
    public int Count => files.Count;

    public FormFile this[int index]
    {
        get { return files[index]; }
    }

    public FormFile this[string index]
    {
        get { return files.Where(f => f.Name == index).FirstOrDefault(); }
    }

    public void Add(FormFile item)
    {
        files.Add(item);
    }

    public void AddRange(IEnumerable<FormFile> items)
    {
        files.AddRange(items);
    }

    public IEnumerator<FormFile> GetEnumerator()
    {
        return files.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }
}

转载于:https://www.cnblogs.com/junio/p/10765633.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值