¿Cómo subir un archivo y datos JSON en Postman?

134

Estoy usando Spring MVC y este es mi método:

/**
* Upload single file using Spring Controller.
*/
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public @ResponseBody ResponseEntity<GenericResponseVO<? extends IServiceVO>> uploadFileHandler(
            @RequestParam("name") String name,
            @RequestParam("file") MultipartFile file,
            HttpServletRequest request,
            HttpServletResponse response) {

    if (!file.isEmpty()) {
        try {
            byte[] bytes = file.getBytes();

            // Creating the directory to store file
            String rootPath = System.getProperty("catalina.home");
            File dir = new File(rootPath + File.separator + "tmpFiles");
            if (!dir.exists()) {
                dir.mkdirs();
            }

            // Create the file on server
            File serverFile = new File(dir.getAbsolutePath() + File.separator + name);
            BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile));
            stream.write(bytes);
            stream.close();

            System.out.println("Server File Location=" + serverFile.getAbsolutePath());

            return null;
        } catch (Exception e) {
            return null;
        }
    }
}


Necesito pasar el id de sesión en cartero y también el archivo. ¿Cómo puedo hacer eso?

Harikrishnan KN
fuente

Respuestas:

221

En cartero, establezca el tipo de método en POST .

Luego seleccione Cuerpo -> datos de formulario -> Ingrese el nombre de su parámetro ( archivo de acuerdo con su código)

y en el lado derecho al lado de la columna de valor, habrá un desplegable "texto, archivo" , seleccione Archivo . elige tu archivo de imagen y publícalo.

Para el resto de parámetros basados ​​en "texto" , puede publicarlo como lo hace normalmente con cartero. Simplemente ingrese el nombre del parámetro y seleccione "texto" en el menú desplegable del lado derecho e ingrese cualquier valor para él, presione el botón enviar. Su método de controlador debe ser llamado.

Sumit Badaya
fuente
44
¿Por qué POST? ¿Qué hay de PUT?
Verde
44
¿Qué quieres decir con "no funciona"? ¿Por qué no nos muestra su código para que podamos solucionar el problema fácilmente?
Sumit Badaya
2
Me sale la parte del texto como Stringsiempre. ¿Por qué no se asigna a mi DTO? @PostMapping ( value = "/byImageFile", consumes = { "multipart/form-data" }) public ResponseEntity<?> postMap( @RequestPart ( "imageFile") MultipartFile imageFile, @RequestPart ( "fieldsToExtract") RequestDto requestDto ) No puedo enviar la solicitud del cartero en este caso
Arun Gowda
@ArunGowda Intente publicar su consulta como nueva Pregunta. Como es diferente del cartel de preguntas aquí y la respuesta dada es relevante a la pregunta publicada aquí por OP.
Sumit Badaya
1
Encontré mi solución. No se asignará RequestDtoautomáticamente. Lo tomé como una cadena, lo analicé Jsony lo mapeé RequestDtoexplícitamente.
Arun Gowda
111

La guía visual que falta

Primero debes encontrar el menú desplegable casi invisible de color gris pálido sobre blanco para el Filecual es la llave mágica que desbloquea el Choose Filesbotón.

Después de que elija POST, luego elija Body->form-data, luego busque el menú desplegable Archivo y luego elija 'Archivo', solo entonces aparecerá mágicamente el botón 'Elegir archivos':

Configuración del archivo POST del cartero: menú desplegable (Texto, Archivo) resaltado

Chris F Carroll
fuente
1
tienes razón en que la IU para esto es invisible para los no iniciados. ¡Gracias por la versión visual!
Vijay
¿Qué sucede si tengo una carga útil del cuerpo XML y el archivo adjunto?
tuxErrante
¿La respuesta de gce parece decir que puedes hacerlo fácilmente? No estoy seguro . Es posible que tenga que aprender a combinar el archivo adjunto y el XML en un solo documento aprendiendo sobre el formato MIME de varias partes. Lo que no es demasiado complicado, puede crear un cuerpo mimo multiparte a mano.
Chris F Carroll
Dos años después, la interfaz de usuario no se ha mejorado.
Sabuncu
47

Tal vez podrías hacerlo de esta manera:

postman_file_upload_with_json

gce
fuente
8
¿Qué 6 encabezados has configurado allí?
Verde
1
Esta solución me funciona. No pasó ningún encabezado y funciona bien. Gracias. Pasar JSON fue la parte difícil para mí. :)
Gaurav Sharma
Ja, inteligente - cambié mi punto final para hacer eso :) Un poco feo pero muy conveniente
Chris Koston
¿Puedes explicar de qué estás hablando? @ChrisKoston
tlalco
17

Me gusta esto :

ingrese la descripción de la imagen aquí

Cuerpo -> datos de formulario -> seleccionar archivo

Debe escribir "archivo" en lugar de "nombre"

También puede enviar datos JSON desde Cuerpo -> campo sin procesar. (Solo pegue la cadena JSON)

burakozgul
fuente
3
en realidad necesito pasar algunos valores y presentarlo en el cartero para un servicio, eso es posible
Harikrishnan KN
1
Encabezados? ¿Qué encabezados configurar?
Verde
11
La pregunta también requiere cargar datos json, que no se cubren aquí en esta respuesta.
Rohit
La forma correcta de hacer esto: stackoverflow.com/questions/21329426/…
dassum
10
  1. No le des ningún encabezado.
  2. Ponga sus datos json dentro de un archivo .json.
  3. Seleccione sus dos archivos, uno es su archivo .txt y otro es el archivo .json para sus claves de parámetros de solicitud.
Rohit Thakur
fuente
Esta es una buena respuesta ... Esto también se puede usar para casos de uso en los que se deben cargar varios archivos junto con una carga útil json en una carga útil de varias partes ...
Kiran
Esta es la respuesta más correcta si desea enviar un archivo y datos JSON. Los ejemplos que muestran la selección de un archivo y luego los datos JSON que se pasan como un solo valor de cadena JSON o la división de los valores no funcionan (posiblemente dependiendo del punto final, pero no puedo verificar esto). También se menciona aquí: github.com/postmanlabs/postman-app-support/issues/3331
Anto
8

Si necesita cargar archivos en varias partes utilizando datos de formulario y enviar datos json (objeto Dto) en la misma solicitud POST

Obtenga su objeto JSON como String en Controller y hágalo Deserializar agregando esta línea

ContactDto contactDto  = new ObjectMapper().readValue(yourJSONString, ContactDto.class);
Ajay k
fuente
1
¿Me puede decir cuáles son los dos encabezados utilizados?
Abhisek Roy
Tipo de contenido: aplicación / json Autorización: portador (yourTokenString)
Ajay k
Si funcionó. Gracias. Utilicé el siguiente código y trabajé: @PostMapping (value = Constant.API_INITIAL + "/ uploadFile") public UploadFileResponse uploadFile (@RequestParam ("file") Archivo MultipartFile, String jsonFileVo) {FileUploadVo fileUploadVo = null; pruebe {fileUploadVo = new ObjectMapper (). readValue (jsonFileVo, FileUploadVo.class); } catch (Excepción e) {e.printStackTrace (); }
Anand_5050
puede configurar el Tipo de contenido para contactDtoString en application / json, puede hacer esto para cada clave
Hritcu Andrei
7

Cartero multiparte forma-datos contenido-tipo

Seleccione [Tipo de contenido] en [MOSTRAR COLUMNAS] y luego configure el tipo de contenido de "aplicación / json" en el parámetro de texto json.

otamega
fuente
6

Si alguien necesitara:

cuerpo -> datos de formulario

Agregar nombre de campo como matriz

ingrese la descripción de la imagen aquí

Sebastiao Marcos
fuente
6

Si alguien quiere enviar datos json en formato de datos de formulario, solo necesita declarar las variables como esta

Cartero:

Como puede ver, el parámetro de descripción estará en formato json básico, resultado de eso:

{ description: { spanish: 'hola', english: 'hello' } }
Sebastian Ardila
fuente
2

Necesitaba pasar ambos: un archivo y un número entero. Lo hice de esta manera:

  1. necesitaba pasar un archivo para cargar: lo hice según la respuesta de Sumit.

    Tipo de solicitud: POST

    Cuerpo -> datos de formulario

    debajo del encabezado CLAVE , ingresé el nombre de la variable ('archivo' en mi código de fondo).

    en el backend:

    file = request.files['file']

    Junto a 'archivo', hay un cuadro desplegable que le permite elegir entre 'Archivo' o 'Texto'. Elija 'Archivo' y bajo el título VALOR , apareció 'Seleccionar archivos'. Hice clic en este que abrió una ventana para seleccionar el archivo.

2. necesario para pasar un número entero:

fui a:

Params

nombre de la variable ingresada (por ejemplo, id) debajo de KEY y su valor (por ejemplo: 1) debajo de VALUE

en el backend:

id = request.args.get('id')

¡Trabajó!

Vinci Mojamdar
fuente
2

Use el código a continuación en el lado de descanso de primavera:

@PostMapping(value = Constant.API_INITIAL + "/uploadFile")
    public UploadFileResponse uploadFile(@RequestParam("file") MultipartFile file,String jsonFileVo) {
        FileUploadVo fileUploadVo = null;
        try {
            fileUploadVo = new ObjectMapper().readValue(jsonFileVo, FileUploadVo.class);
        } catch (Exception e) {
            e.printStackTrace();
        }

ingrese la descripción de la imagen aquí

Anand_5050
fuente
2

Para cada clave de datos de formulario, puede establecer Content-Type, hay un botón de cartero a la derecha para agregar la columna Content-Type, y no tiene que analizar un json desde una cadena dentro de su Controlador.

Hritcu Andrei
fuente
1

Si desea realizar una PUTsolicitud, simplemente haga todo como una POSTsolicitud, pero agregue _method=> PUTa sus form-dataparámetros.

kubilay
fuente
0

Si usa cookies para mantener la sesión, puede usar el interceptor para compartir cookies del navegador al cartero.

Además, para cargar un archivo, puede usar la pestaña de datos de formulario debajo de la pestaña del cuerpo del cartero, en la que puede proporcionar datos en formato clave-valor y para cada clave puede seleccionar el tipo de texto / archivo de valor. cuando selecciona la opción de tipo de archivo apareció para cargar el archivo.

Sandesh Jain
fuente
2
Para lo que está obteniendo 500. ¿podría compartir algunos detalles más?
Sandesh Jain