¿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?

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.


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


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


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)


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.

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

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.


6

Si alguien necesitara:

cuerpo -> datos de formulario

Agregar nombre de campo como matriz

ingrese la descripción de la imagen aquí


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' } }

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ó!


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í


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.


1

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



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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.