Probablemente sea una pregunta estúpida, pero tengo una de esas noches. En una aplicación estoy desarrollando RESTful API y queremos que el cliente envíe datos como JSON. Parte de esta aplicación requiere que el cliente cargue un archivo (generalmente una imagen), así como información sobre la imagen.
Me resulta difícil rastrear cómo sucede esto en una sola solicitud. ¿Es posible Base64 los datos del archivo en una cadena JSON? ¿Voy a necesitar realizar 2 publicaciones en el servidor? ¿No debería estar usando JSON para esto?
Como nota al margen, estamos utilizando Grails en el back-end y los clientes móviles nativos (iPhone, Android, etc.) acceden a estos servicios, si algo de eso marca la diferencia.
json
rest
grails
file-upload
Gregg
fuente
fuente
Respuestas:
Hice una pregunta similar aquí:
¿Cómo subo un archivo con metadatos usando un servicio web REST?
Básicamente tienes tres opciones:
multipart/form-data
POST y devuelva una identificación al cliente. Luego, el cliente envía los metadatos con la ID y el servidor vuelve a asociar el archivo y los metadatos.fuente
Puede enviar el archivo y los datos en una sola solicitud utilizando el tipo de contenido multipart / form-data :
De http://www.faqs.org/rfcs/rfc2388.html :
Puede incluir información de archivo o información de campo dentro de cada sección entre límites. Implementé con éxito un servicio RESTful que requería que el usuario enviara datos y un formulario, y multipart / form-data funcionó perfectamente. El servicio se creó con Java / Spring, y el cliente usaba C #, por lo que desafortunadamente no tengo ningún ejemplo de Grails que pueda brindarle sobre cómo configurar el servicio. No necesita utilizar JSON en este caso ya que cada sección de "datos de formulario" le proporciona un lugar para especificar el nombre del parámetro y su valor.
Lo bueno de usar datos multiparte / formulario es que está usando encabezados definidos por HTTP, por lo que se apega a la filosofía REST de usar herramientas HTTP existentes para crear su servicio.
fuente
Sé que este hilo es bastante antiguo, sin embargo, me falta una opción aquí. Si tiene metadatos (en cualquier formato) que desea enviar junto con los datos para cargar, puede hacer una sola
multipart/related
solicitud.Puede consultar la especificación RFC 2387 para obtener detalles más detallados.
Básicamente, cada parte de dicha solicitud puede tener contenido con un tipo diferente y todas las partes están relacionadas de alguna manera (por ejemplo, una imagen y sus metadatos). Las partes se identifican por una cadena de límite, y la cadena de límite final es seguida por dos guiones.
Ejemplo:
fuente
Sé que esta pregunta es antigua, pero en los últimos días había buscado en toda la web para resolver esta misma pregunta. Tengo servicios web REST y cliente de iPhone que envían imágenes, títulos y descripciones.
No sé si mi enfoque es el mejor, pero es tan fácil y simple.
Tomo una foto usando el UIImagePickerController y envío al servidor los NSData usando las etiquetas de encabezado de solicitud para enviar los datos de la imagen.
En el lado del servidor, recibo la foto usando el código:
No sé si tengo problemas en el futuro, pero ahora funciona bien en el entorno de producción.
fuente
Aquí está mi API de enfoque (uso ejemplo): como puede ver, no uso ninguno
file_id
(identificador de archivo cargado en el servidor) en la API:Crear
photo
objeto en el servidor:Cargar archivo (tenga
file
en cuenta que está en forma singular porque es solo uno por foto):Y luego, por ejemplo:
Leer lista de fotos
Leer algunos detalles de la foto
Leer archivo de foto
Entonces, la conclusión es que, primero crea un objeto (foto) por POST, y luego envía una segunda solicitud con el archivo (nuevamente POST).
fuente
Objetos FormData: cargar archivos usando Ajax
XMLHttpRequest Level 2 agrega soporte para la nueva interfaz FormData. Los objetos FormData proporcionan una manera de construir fácilmente un conjunto de pares clave / valor que representan campos de formulario y sus valores, que luego pueden enviarse fácilmente utilizando el método XMLHttpRequest send ().
https://developer.mozilla.org/en-US/docs/Web/API/FormData
fuente
Como el único ejemplo que falta es el ejemplo de ANDROID , lo agregaré. Esta técnica utiliza un AsyncTask personalizado que debe declararse dentro de su clase de Actividad.
Entonces, cuando quieras subir tu archivo solo llama:
fuente
Quería enviar algunas cadenas al servidor de fondo. No utilicé json con multiparte, utilicé parámetros de solicitud.
Url se vería así
Estoy pasando dos parámetros (uuid y type) junto con la carga del archivo. Espero que esto ayude a quienes no tienen los complejos datos json para enviar.
fuente
Puede intentar usar https://square.github.io/okhttp/ library. Puede configurar el cuerpo de la solicitud en multiparte y luego agregar el archivo y los objetos json por separado de la siguiente manera:
fuente
fuente
Asegúrese de tener la siguiente importación. Por supuesto, otras importaciones estándar
fuente
java.lang.ClassCastException: org.springframework.core.io.FileSystemResource cannot be cast to java.lang.String