Come caricare un file e i dati JSON in Postman?


134

Sto usando Spring MVC e questo è il mio metodo:

/**
* 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;
        }
    }
}


Devo passare l'id di sessione in postman e anche il file. Come lo posso fare?

Risposte:


221

In postino, imposta il tipo di metodo su POST .

Quindi selezionare Body -> form-data -> Immettere il nome del parametro ( file in base al codice)

e sul lato destro accanto alla colonna del valore, ci sarà il menu a discesa "testo, file" , selezionare File . scegli il tuo file immagine e pubblicalo.

Per il resto dei parametri basati su "testo" , puoi pubblicarlo come fai normalmente con Postman. Basta inserire il nome del parametro e selezionare "testo" dal menu a discesa sul lato destro e inserire qualsiasi valore per esso, premere il pulsante di invio. Il metodo del controller dovrebbe essere chiamato.


4
Perché POST? Che dire PUT?
— Verde,

4
Cosa intendi con "Non funziona"? Perché non ci mostri il codice per eseguire facilmente il debug del problema?
— Sumit Badaya,

2
Ricevo la parte di testo come Stringsempre. Perché non si associa al mio DTO? @PostMapping ( value = "/byImageFile", consumes = { "multipart/form-data" }) public ResponseEntity<?> postMap( @RequestPart ( "imageFile") MultipartFile imageFile, @RequestPart ( "fieldsToExtract") RequestDto requestDto ) In questo caso non sono in grado di inviare il requisito dal postino
— Arun Gowda,

@ArunGowda Prova a pubblicare la tua query come nuova domanda. Poiché è diverso dal poster della domanda qui e la risposta fornita è rilevante per la domanda pubblicata qui dall'OP.
— Sumit Badaya,

1
Ho trovato la mia soluzione. Non verrà mappato RequestDtoautomaticamente. L'ho preso come una stringa, analizzato Jsone mappato in modo RequestDtoesplicito.
— Arun Gowda,

111

La guida visiva mancante

Devi prima trovare il menu a discesa quasi invisibile grigio chiaro su bianco per il Filequale è la chiave magica che sblocca il Choose Filespulsante.

Dopo aver scelto POST, quindi scegliere Body->form-data, quindi trovare il menu a discesa File e quindi scegliere 'File', solo allora apparirà magicamente il pulsante 'Scegli file':

Impostazione file POST Postino - Menu a discesa (Testo, File) evidenziato


1
hai ragione in quanto l'interfaccia utente per questo è invisibile ai non iniziati. Grazie per la versione visiva!
— Vijay,

cosa succede se ho un payload del corpo XML e l'allegato?
— tuxErrante,

La risposta di Gce sembra dire che puoi farlo abbastanza facilmente? Non ne sono sicuro . Potrebbe essere necessario imparare a combinare l'allegato e l'XML in un unico documento, imparando a conoscere il formato mime in più parti. Il che non è troppo complicato, puoi creare un corpo mime multipart a mano.
— Chris F Carroll,

Due anni dopo, l'interfaccia utente non è stata migliorata.
— Sabuncu,

47

Forse potresti farlo in questo modo:

postman_file_upload_with_json


8
Quali 6 intestazioni hai impostato lì?
— Verde,

1
Questa soluzione funziona per me. Non ha superato nessuna testata e funziona bene. Grazie. Passare JSON è stata la parte difficile per me. :)
— Gaurav Sharma,

Ah, intelligente - ha cambiato il mio endpoint per farlo :) Un po 'brutto ma super conveniente
— Chris Koston,

Puoi spiegare di cosa stai parlando? @ChrisKoston
— tlalco,

17

Come questo :

inserisci qui la descrizione dell'immagine

Corpo -> form-data -> seleziona file

Devi scrivere "file" invece di "nome"

Inoltre è possibile inviare dati JSON da Body -> campo non elaborato. (Basta incollare la stringa JSON)


3
in realtà ho bisogno di passare alcuni valori e file in postino per un servizio è possibile
— Harikrishnan KN

1
Intestazioni? quali intestazioni impostare?
— Verde,

11
La domanda richiede anche il caricamento di dati json, che non è trattato qui in questa risposta.
— Rohit,

Il modo corretto per fare questo: stackoverflow.com/questions/21329426/...
— dassum

10
  1. Non dare intestazioni.
  2. Inserisci i tuoi dati json in un file .json.
  3. Seleziona entrambi i file uno è il tuo file .txt e l'altro è il file .json per le tue chiavi param della richiesta.

Questa è una buona risposta .. Può essere utilizzata anche per casi d'uso in cui è necessario caricare più file insieme a un payload json in un payload in più parti ..
— Kiran,

Questa è la risposta più corretta se si desidera inviare un file e i dati JSON. Gli esempi che mostrano la selezione di un file e quindi il passaggio dei dati JSON come singolo valore di stringa JSON o la divisione dei valori non funzionano (probabilmente a seconda del punto finale ma non posso verificarlo). È anche menzionato qui: github.com/postmanlabs/postman-app-support/issues/3331
— Anto

8

Se è necessario caricare il file in più parti utilizzando i dati del modulo e inviare i dati json (oggetto Dto) nella stessa richiesta POST

Ottieni il tuo oggetto JSON come stringa nel controller e rendilo deserializzato aggiungendo questa riga

ContactDto contactDto  = new ObjectMapper().readValue(yourJSONString, ContactDto.class);

1
Puoi dirmi quali sono le due intestazioni utilizzate?
— Abhisek Roy,

Tipo di contenuto: application / json Autorizzazione: bearer (yourTokenString)
— Ajay k

Sì, ha funzionato. Grazie. Ho usato il codice seguente e ho lavorato: @PostMapping (value = Constant.API_INITIAL + "/ uploadFile") public UploadFileResponse uploadFile (@RequestParam ("file") File MultipartFile, String jsonFileVo) {FileUploadVo fileUploadVo = null; provare {fileUploadVo = new ObjectMapper (). readValue (jsonFileVo, FileUploadVo.class); } catch (Exception e) {e.printStackTrace (); }
— Anand_5050 il

puoi impostare Content-Type per contactDtoString su application / json, puoi farlo per ogni tasto
— Hritcu Andrei

7

Tipo postman multipart-data-content-type

Selezionare [Tipo di contenuto] da [MOSTRA COLONNE], quindi impostare il tipo di contenuto di "application / json" sul parametro del testo json.



6

Se qualcuno vuole inviare dati json in formato form-data, devi solo dichiarare le variabili in questo modo

Postino:

Come vedi, il parametro description sarà nel formato json di base, risultato di questo:

{ description: { spanish: 'hola', english: 'hello' } }

2

Avevo bisogno di passare entrambi: un file e un numero intero. L'ho fatto in questo modo:

  1. necessario passare un file da caricare: lo ha fatto secondo la risposta di Sumit.

    Tipo di richiesta: POST

    Corpo -> modulo-dati

    sotto l'intestazione KEY , ho inserito il nome della variabile ('file' nel mio codice di backend).

    nel backend:

    file = request.files['file']

    Accanto a "file", c'è una casella a discesa che ti permette di scegliere tra "File" o "Testo". Scegli "File" e sotto l'intestazione VALUE , appare "Seleziona file". Cliccato su questo che ha aperto una finestra per selezionare il file.

2. necessario per passare un numero intero:

è andato a:

Parametri

immesso il nome della variabile (ad es. id) in KEY e il suo valore (ad es. 1) in VALUE

nel backend:

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

Lavorato!


2

Utilizzare sotto il codice nel lato poggiagambe:

@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();
        }

inserisci qui la descrizione dell'immagine


2

Per ogni chiave di dati del modulo che puoi impostare Content-Type, c'è un pulsante postino sulla destra per aggiungere la colonna Content-Type e non devi analizzare un json da una stringa all'interno del tuo Controller.


1

Se vuoi fare una PUTrichiesta, fai tutto come POSTrichiesta ma aggiungi _method=> PUTai tuoi form-dataparametri.



0

Se si utilizzano i cookie per mantenere la sessione, è possibile utilizzare l' interceptor per condividere i cookie dal browser al postino.

Inoltre per caricare un file è possibile utilizzare la scheda modulo-dati nella scheda body sul postino, in cui è possibile fornire dati in formato valore-chiave e per ogni chiave è possibile selezionare il tipo di valore testo / file. quando si seleziona l'opzione del tipo di file è apparso per caricare il file.


2
Per quello che stai ottenendo 500. puoi per favore condividere qualche dettaglio in più
— Sandesh Jain,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.