Cómo configurar un controlador webapi para multipart / form-data

Estoy tratando de encontrar la manera de hacer esto. No recibí ningún mensaje de error útil con mi código, así que usé algo más para generar algo. He adjuntado ese código después del mensaje de error. Encontré un tutorial sobre él, pero no sé cómo implementarlo con lo que tengo. Esto es lo que tengo actualmente

public async Task PostFile() { if (!Request.Content.IsMimeMultipartContent()) throw new Exception(); var provider = new MultipartMemoryStreamProvider(); var result = new { file = new List() }; var item = new File(); item.CompanyName = HttpContext.Current.Request.Form["companyName"]; item.FileDate = HttpContext.Current.Request.Form["fileDate"]; item.FileLocation = HttpContext.Current.Request.Form["fileLocation"]; item.FilePlant = HttpContext.Current.Request.Form["filePlant"]; item.FileTerm = HttpContext.Current.Request.Form["fileTerm"]; item.FileType = HttpContext.Current.Request.Form["fileType"]; var manager = new UserManager(new UserStore(new ApplicationDbContext())); var user = manager.FindById(User.Identity.GetUserId()); item.FileUploadedBy = user.Name; item.FileUploadDate = DateTime.Now; await Request.Content.ReadAsMultipartAsync(provider) .ContinueWith(async (a) => { foreach (var file in provider.Contents) { if (file.Headers.ContentLength > 1000) { var filename = file.Headers.ContentDisposition.FileName.Trim('\"'); var contentType = file.Headers.ContentType.ToString(); await file.ReadAsByteArrayAsync().ContinueWith(b => { item.FilePdf = b.Result; }); } } }).Unwrap(); db.Files.Add(item); db.SaveChanges(); return result; } 

error

Objeto {mensaje: “El tipo de medio de la entidad de solicitud ‘multipart / form-data’ no es compatible con este recurso.”, ExceptionMessage: “No MediaTypeFormatter está disponible para leer un contenido obje … om con tipo de medio ‘multipart / form-data’ . “, exceptionType:” System.Net.Http.UnsupportedMediaTypeException “, stackTrace:” en System.Net.Http.HttpContentExtensions.ReadAs … atterLogger, CancellationToken cancellationToken) “} exceptionMessage:” No MediaTypeFormatter está disponible para leer un objeto de tipo ‘ HttpPostedFileBase ‘del contenido con tipo de medio’ multipart / form-data ‘. “ExceptionType:” System.Net.Http.UnsupportedMediaTypeException “mensaje:” El tipo de medio de la entidad de solicitud’ multipart / form-data ‘no es compatible con este recurso. ” stackTrace: “en System.Net.Http.HttpContentExtensions.ReadAsAsync [T] (contenido HttpContent, tipo de tipo, 1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken) ↵ at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable IEnumerable 1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken) ↵ at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable 1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken) ↵ at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable 1 formateadores, IFormatterLogger formateadorLogger, CancelaciónToken cancellationToken)

Código utilizado para generar un mensaje de error

  [HttpPost] public string UploadFile(HttpPostedFileBase file) { if (file.ContentLength > 0) { var fileName = Path.GetFileName(file.FileName); var path = Path.Combine(HttpContext.Current.Server.MapPath("~/uploads"), fileName); file.SaveAs(path); } return "/uploads/" + file.FileName; } 

clase

 public class File { public int FileId { get; set; } public string FileType { get; set; } public string FileDate { get; set; } public byte[] FilePdf { get; set; } public string FileLocation { get; set; } public string FilePlant { get; set; } public string FileTerm { get; set; } public DateTime? FileUploadDate { get; set; } public string FileUploadedBy { get; set; } public string CompanyName { get; set; } public virtual ApplicationUser User { get; set; } } 

Normalmente utilizo el parámetro HttpPostedFileBase solo en Controladores Mvc . Al tratar con ApiControllers intente verificar la propiedad HttpContext.Current.Request.Files para los archivos entrantes en su lugar:

 [HttpPost] public string UploadFile() { var file = HttpContext.Current.Request.Files.Count > 0 ? HttpContext.Current.Request.Files[0] : null; if (file != null && file.ContentLength > 0) { var fileName = Path.GetFileName(file.FileName); var path = Path.Combine( HttpContext.Current.Server.MapPath("~/uploads"), fileName ); file.SaveAs(path); } return file != null ? "/uploads/" + file.FileName : null; } 

Esto es lo que resolvió mi problema
Agregue la siguiente línea a WebApiConfig.cs

 config.Formatters.XmlFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("multipart/form-data")); 

Puedes usar algo como esto

 [HttpPost] public async Task AddFile() { if (!Request.Content.IsMimeMultipartContent()) { this.Request.CreateResponse(HttpStatusCode.UnsupportedMediaType); } string root = HttpContext.Current.Server.MapPath("~/temp/uploads"); var provider = new MultipartFormDataStreamProvider(root); var result = await Request.Content.ReadAsMultipartAsync(provider); foreach (var key in provider.FormData.AllKeys) { foreach (var val in provider.FormData.GetValues(key)) { if (key == "companyName") { var companyName = val; } } } // On upload, files are given a generic name like "BodyPart_26d6abe1-3ae1-416a-9429-b35f15e6e5d5" // so this is how you can get the original file name var originalFileName = GetDeserializedFileName(result.FileData.First()); var uploadedFileInfo = new FileInfo(result.FileData.First().LocalFileName); string path = result.FileData.First().LocalFileName; //Do whatever you want to do with your file here return this.Request.CreateResponse(HttpStatusCode.OK, originalFileName ); } private string GetDeserializedFileName(MultipartFileData fileData) { var fileName = GetFileName(fileData); return JsonConvert.DeserializeObject(fileName).ToString(); } public string GetFileName(MultipartFileData fileData) { return fileData.Headers.ContentDisposition.FileName; } 

revisa tu WebApiConfig y agrega esto

 GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear(); 

Obtiene el HTTP 415 “El tipo de medio de la entidad de solicitud ‘multipart / form-data’ no es compatible con este recurso.” porque no ha mencionado el tipo de contenido correcto en su solicitud.