WebApi实现多文件上传

WebApi实现多文件上传

Api

#region UploadScanPage
/// <summary>
/// Post
/// </summary>
/// <returns></returns>
[HttpPost]
[Route("api/scn/UploadScanPage")]
[ResponseType(typeof(Resource))]
public async Task<IHttpActionResult> Post()
{
    var resources = new List<Resource>();

    // multipart/form-data  
    // 采用MultipartMemoryStreamProvider  
    var provider = new MultipartMemoryStreamProvider();

    // 读取文件数据  
    await Request.Content.ReadAsMultipartAsync(provider);

    foreach (var item in provider.Contents)
    {
        // 判断是否是文件  
        if (item.Headers.ContentDisposition.FileName == null) continue;
        // 获取到流  
        var ms = item.ReadAsStreamAsync().Result;
        // 进行流操作  
        using (var br = new BinaryReader(ms))
        {
            if (ms.Length <= 0)
                break;
            // 读取文件内容到内存中  
            var data = br.ReadBytes((int) ms.Length);

            /*
            // Create  
            // 当前时间作为ID  
            var resource = new Resource()
            {
                Id = DateTime.Now.ToString("yyyyMMddHHmmssffff", DateTimeFormatInfo.InvariantInfo)
            };
            */

            // Info  
            var info = new FileInfo(item.Headers.ContentDisposition.FileName.Replace("\"", ""));
            var resource = new Resource
            {
                Id = info.Name,
                Type = info.Extension.Substring(1).ToLower()
            };
            // 文件类型  

            // Write  
            try
            {
                // 文件存储地址  
                var dirPath = Path.Combine(RootPath);
                if (!Directory.Exists(dirPath))
                {
                    Directory.CreateDirectory(dirPath);
                }

                File.WriteAllBytes(Path.Combine(dirPath, resource.Id), data);
                resources.Add(resource);
            }
            catch
            {
                // ignored
            }
        }
    }

    // 返回  
    switch (resources.Count)
    {
        case 0:
            return BadRequest();
        case 1:
            return Ok(resources.FirstOrDefault());
        default:
            return Ok(resources);
    }
}
#endregion

Resource

public class Resource
{
    public string Id { get; set; }
    public string Type { get; set; }
}

UpLoadFileTest

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace UpLoadFileTest
{
    public class UpLoadFileTest
    {
        /// <summary>
        /// BatchUpLoadFiles
        /// </summary>
        /// <param name="baseAddress"></param>
        /// <param name="postUrl"></param>
        /// <param name="imagesPath"></param>
        /// <param name="files"></param>
        public void BatchUpLoadFiles(string baseAddress, string postUrl
            ,string imagesPath, List<string> files)
        {
            /*
             * 批量上传图片
             * baseAddress: "http://localhost:7427/"
             * postUrl: "/api/scn/UploadScanPage"
             * imagesPath: "e:\10001003\"
             * filePath: "e:\10001003\1.jpg"
             */
            using (var client = new HttpClient())
            {
                using (var content = new MultipartFormDataContent())
                {
                    // Make sure to change API address  
                    client.BaseAddress = new Uri(baseAddress);

                    var count = 1;

                    foreach (var imageName in files)
                    {
                        // Add file content   
                        var filePath = imagesPath + imageName;
                        var fileContent = new ByteArrayContent(File.ReadAllBytes(@filePath));
                        fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
                        {
                            FileName = imageName
                        };
                        content.Add(fileContent);

                        Console.WriteLine((count++) + "/" + files.Count);
                    }

                    // Make a call to Web API  
                    var result = client.PostAsync(postUrl, content).Result;
                    Console.WriteLine(result.StatusCode);
                    Console.ReadLine();
                }
            }
        }
    }
}

Program

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace UpLoadFileTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var baseAddress = "http://localhost:7427/";
            var postUrl = "/api/scn/UploadScanPage";
            var imagesPath = @"e:\10001003\";

            var files = new List<string> {"1.jpg", "2.jpg"};


            new UpLoadFileTest().BatchUpLoadFiles(baseAddress, postUrl, imagesPath, files);
        }

    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • 本文包括:1、文件上传概述2、利用 Commons-fileupload 组件实现文件上传3、核心API——Dis...
    廖少少阅读 12,618评论 5 91
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,556评论 25 708
  • 或许诚恳请求 也唤不到自己想要的,唯有学会如何在雨中撑伞等待。 大学高数老师有一双水润的眼睛,闪闪发光,虽...
    桦子语阅读 337评论 0 0
  • 早安,今天早餐:毛豆炒蘑菇+烤馒头+祖名豆干+五香鹌鹑蛋+牛奶 每当吃到蘑菇,我就会想起妈妈。小时候家里没钱,蘑菇...
    雨栖迟阅读 581评论 2 2