WEB API 使用MultipartFormDataStreamProvider上传文件

来源:互联网 发布:java运行class文件命令 编辑:程序博客网 时间:2024/05/16 09:35

简短教程中我们打算如何上传多个文件ASP.Net WebAPI 使用 MultipartFormDataStreamProvider概念基于部分/格式数据我们可以在这里发布多个文件内容不仅 NameValueCollection 作为服务器提供常规表单字段教程中我们看到如何重写默认行为 MultipartFormDataStreamProvider名称存储一个独特BodyPart_ {GUID} 格式中

using System;using System.Collections.Generic;using System.Diagnostics;using System.IO;using System.Linq;using System.Net;using System.Net.Http;using System.Net.Http.Headers;using System.Threading.Tasks;using System.Web;using System.Web.Http;using System.Web.Mvc;namespace UploadApplication.Controllers{    public class UploadController : ApiController    {        public async Task<HttpResponseMessage> Post()        {            // Check whether the POST operation is MultiPart?            if (!Request.Content.IsMimeMultipartContent())            {                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);            }            // Prepare CustomMultipartFormDataStreamProvider in which our multipart form            // data will be loaded.            string fileSaveLocation = HttpContext.Current.Server.MapPath("~/App_Data");            CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(fileSaveLocation);            List<string> files = new List<string>();            try            {                // Read all contents of multipart message into CustomMultipartFormDataStreamProvider.                await Request.Content.ReadAsMultipartAsync(provider);                foreach (MultipartFileData file in provider.FileData)                {                    files.Add(Path.GetFileName(file.LocalFileName));                }                // Send OK Response along with saved file names to the client.                return Request.CreateResponse(HttpStatusCode.OK, files);            }            catch (System.Exception e)            {                return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);            }        }    }    // We implement MultipartFormDataStreamProvider to override the filename of File which    // will be stored on server, or else the default name will be of the format like Body-    // Part_{GUID}. In the following implementation we simply get the FileName from     // ContentDisposition Header of the Request Body.    public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider    {        public CustomMultipartFormDataStreamProvider(string path) : base(path) { }        public override string GetLocalFileName(HttpContentHeaders headers)        {            return headers.ContentDisposition.FileName.Replace("\"", string.Empty);        }    }}
测试程序
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 ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            using (var client = new HttpClient())            using (var content = new MultipartFormDataContent())            {                // Make sure to change API address                client.BaseAddress = new Uri("http://localhost:53798/");                // Add first file content                 var fileContent1 = new ByteArrayContent(File.ReadAllBytes(@"c:\Users\aisadmin\Desktop\Me\NF2202533167366.pdf"));                fileContent1.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")                {                    FileName = "Sample.pdf"                };                // Add Second file content                var fileContent2 = new ByteArrayContent(File.ReadAllBytes(@"c:\Users\aisadmin\Desktop\Sample.txt"));                fileContent2.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")                {                    FileName = "Sample.txt"                };                content.Add(fileContent1);                content.Add(fileContent2);                // Make a call to Web API                var result = client.PostAsync("/api/upload", content).Result;                Console.WriteLine(result.StatusCode);                Console.ReadLine();            }        }    }}


3 0
原创粉丝点击