webapi type the supported resource plain not form for files data current asp and c# asp.net-web-api multipartform-data

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



upload file web api 2 (5)

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"));

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<object> PostFile() { if (!Request.Content.IsMimeMultipartContent()) throw new Exception(); var provider = new MultipartMemoryStreamProvider(); var result = new { file = new List<object>() }; 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<ApplicationUser>(new UserStore<ApplicationUser>(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; }


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.


Puedes usar algo como esto

[HttpPost] public async Task<HttpResponseMessage> 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();