Estoy usando asp.net mvc 4 webapi beta para construir un servicio de descanso. Necesito poder aceptar imágenes / archivos POST de aplicaciones de cliente. ¿Es esto posible usando el webapi? A continuación se muestra cómo acción estoy usando actualmente. ¿Alguien sabe de un ejemplo de cómo debería funcionar esto?
[HttpPost]
public string ProfileImagePost(HttpPostedFile profileImage)
{
string[] extensions = { ".jpg", ".jpeg", ".gif", ".bmp", ".png" };
if (!extensions.Any(x => x.Equals(Path.GetExtension(profileImage.FileName.ToLower()), StringComparison.OrdinalIgnoreCase)))
{
throw new HttpResponseException("Invalid file type.", HttpStatusCode.BadRequest);
}
// Other code goes here
return "/path/to/image.png";
}
c#
asp.net-mvc-4
Phil
fuente
fuente
Request.Files
Respuestas:
ver http://www.asp.net/web-api/overview/formats-and-model-binding/html-forms-and-multipart-mime#multipartmime , aunque creo que el artículo hace que parezca un poco más complicado que realmente es.
Básicamente,
fuente
MultipartFormDataStreamProvider
ya no expone laBodyPartFileNames
propiedad, usé en suFileData.First().LocalFileName
lugar.Me sorprende que muchos de ustedes parezcan querer guardar archivos en el servidor. La solución para mantener todo en la memoria es la siguiente:
fuente
File.WriteAllBytes(filename, buffer);
escribirlo en un archivoVea el código a continuación, adaptado de este artículo , que demuestra el código de ejemplo más simple que pude encontrar. Incluye cargas de archivos y de memoria (más rápidas).
fuente
El modo ASP.NET Core ahora está aquí :
fuente
Aquí hay una solución rápida y sucia que toma el contenido del archivo cargado del cuerpo HTTP y lo escribe en un archivo. Incluí un fragmento HTML / JS "básico" para la carga del archivo.
Método de API web:
Carga de archivos HTML:
fuente
Usé la respuesta de Mike Wasson antes de actualizar todos los NuGets en mi proyecto webapi mvc4. Una vez que lo hice, tuve que volver a escribir la acción de carga del archivo:
Aparentemente, BodyPartFileNames ya no está disponible en MultipartFormDataStreamProvider.
fuente
ReadAsMultipartAsync
y ii) InFile.Move
? 2) ¿podrías hacerasync File.Move
?Hacia estas mismas instrucciones, estoy publicando fragmentos de un cliente y servidor que envían archivos de Excel usando WebApi, c # 4:
Y el controlador del servidor webapi:
Y el Custom MyMultipartFormDataStreamProvider, necesitaba personalizar el nombre del archivo:
PS: tomé este código de otra publicación http://www.codeguru.com/csharp/.net/uploading-files-asynchronously-using-asp.net-web-api .htm
fuente
static method SetFile
en su controlador?path
almacenamiento en la nube.fuente
Aquí hay dos formas de aceptar un archivo. Uno que usa el proveedor de memoria MultipartMemoryStreamProvider y otro que usa MultipartFormDataStreamProvider que guarda en un disco. Tenga en cuenta que esto es solo para cargar un archivo a la vez. Puede extender esto con certeza para guardar múltiples archivos. El segundo enfoque puede admitir archivos grandes. He probado archivos de más de 200 MB y funciona bien. El uso del enfoque en memoria no requiere que guarde en el disco, pero eliminará la excepción de memoria si excede un cierto límite.
fuente
Tuve un problema similar para la vista previa de la API web. Todavía no porté esa parte a la nueva API web MVC 4, pero tal vez esto ayude:
¿Carga de archivos REST con HttpRequestMessage o Stream?
Por favor, hágamelo saber, puede sentarse mañana e intentar implementarlo nuevamente.
fuente
Esta pregunta tiene muchas buenas respuestas incluso para .Net Core. Estaba usando ambos Frameworks, los ejemplos de código proporcionados funcionan bien. Entonces no lo repetiré. En mi caso, lo importante era cómo usar las acciones de carga de archivos con Swagger de esta manera:
Aquí está mi resumen:
ASP .Net WebAPI 2
.NET Core
fuente
Controlador API:
fuente
Complementando la respuesta de Matt Frear: esta sería una alternativa de ASP NET Core para leer el archivo directamente desde Stream, sin guardarlo ni leerlo desde el disco:
fuente