Jak przesłać plik i dane JSON w Postman?

134

Używam Spring MVC i to jest moja metoda:

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


Muszę przekazać identyfikator sesji w listonoszu, a także plik. Jak mogę to zrobić?

Harikrishnan KN
źródło

Odpowiedzi:

221

W programie Postman ustaw typ metody na POST .

Następnie wybierz Body -> form-data -> Wpisz nazwę swojego parametru ( plik zgodny z Twoim kodem)

a po prawej stronie obok kolumny wartości pojawi się menu „tekst, plik” , wybierz Plik . wybierz plik obrazu i opublikuj go.

W przypadku pozostałych parametrów opartych na tekście możesz je opublikować tak, jak zwykle robisz to w przypadku listonosza. Po prostu wprowadź nazwę parametru i wybierz „tekst” z menu rozwijanego po prawej stronie i wprowadź dowolną wartość, naciśnij przycisk wysyłania. Twoja metoda kontrolera powinna zostać wywołana.

Sumit Badaya
źródło
4
Dlaczego POST? O co chodzi PUT?
Green
4
Co masz na myśli mówiąc „Nie działa”? Dlaczego nie pokazujesz nam swojego kodu, abyśmy mogli łatwo debugować problem?
Sumit Badaya,
2
Część tekstową dostaję jak Stringzawsze. Dlaczego nie jest mapowany do mojego DTO? @PostMapping ( value = "/byImageFile", consumes = { "multipart/form-data" }) public ResponseEntity<?> postMap( @RequestPart ( "imageFile") MultipartFile imageFile, @RequestPart ( "fieldsToExtract") RequestDto requestDto ) W tym przypadku w ogóle nie mogę wysłać prośby od listonosza
Arun Gowda
@ArunGowda Spróbuj wysłać zapytanie jako nowe pytanie. Ponieważ różni się od zamieszczonego tutaj plakatu z pytaniami, a udzielona odpowiedź dotyczy pytania zamieszczonego tutaj przez OP.
Sumit Badaya
1
Znalazłem swoje rozwiązanie. Nie zostanie zmapowany RequestDtoautomatycznie. Wziąłem to jako ciąg, przeanalizowałem Jsoni zamapowałem go RequestDtojawnie.
Arun Gowda
111

Brakujący przewodnik wizualny

Najpierw musisz znaleźć prawie niewidoczne, bladoszare, białe menu, dla Filektórego jest magiczny klucz odblokowujący Choose Filesprzycisk.

Po dokonaniu wyboru POST, następnie wybierz Body->form-data, a następnie znajdź listę rozwijaną Plik, a następnie wybierz „Plik”, tylko wtedy przycisk „Wybierz pliki” pojawi się magicznie:

Konfiguracja pliku Postman POST - podświetlona lista rozwijana (Tekst, Plik)

Chris F Carroll
źródło
1
masz rację, ponieważ interfejs użytkownika jest niewidoczny dla niewtajemniczonych. Dziękuję za wersję wizualną!
Vijay
co się stanie, jeśli mam ładunek treści XML i załącznik?
tuxErrante
wydaje się, że odpowiedź gce mówi, że możesz to łatwo zrobić? Nie jestem pewny . Być może będziesz musiał nauczyć się, jak połączyć załącznik i XML w jeden dokument, poznając wieloczęściowy format MIME. Co nie jest zbyt skomplikowane, możesz ręcznie utworzyć wieloczęściowe ciało mima.
Chris F Carroll
Dwa lata później interfejs użytkownika nie został ulepszony.
Sabuncu
47

Może mógłbyś to zrobić w ten sposób:

postman_file_upload_with_json

gce
źródło
8
Jakie 6 nagłówków tam ustawiłeś?
Green
1
To rozwiązanie działa na mnie. Nie przeszedł żadnych nagłówków i działa dobrze. Dzięki. Przekazanie JSON było dla mnie trudną częścią. :)
Gaurav Sharma
Ha, sprytnie - zmieniłem mój punkt końcowy, żeby to zrobić :) Trochę brzydki, ale super wygodny
Chris Koston
Czy możesz wyjaśnić, o czym mówisz? @ChrisKoston
tlalco
17

Lubię to :

wprowadź opis obrazu tutaj

Body -> form-data -> wybierz plik

Musisz wpisać „plik” zamiast „nazwa”

Możesz także wysłać dane JSON z Body -> surowego pola. (Po prostu wklej ciąg JSON)

burakozgul
źródło
3
w rzeczywistości muszę przekazać pewne wartości i złożyć w listonoszu dla jednej usługi, jest to możliwe
Harikrishnan KN
1
Nagłówki? jakie nagłówki ustawić?
Green
11
Pytanie zawiera również prośbę o przesłanie danych json, których nie ma tutaj w tej odpowiedzi.
Rohit
Prawidłowy sposób na zrobienie tego: stackoverflow.com/questions/21329426/ ...
dassum
10
  1. Nie podawaj żadnych nagłówków.
  2. Umieść swoje dane json w pliku .json.
  3. Wybierz oba pliki, jeden to plik .txt, a drugi to plik .json dla kluczy parametrów żądania.
Rohit Thakur
źródło
To jest dobra odpowiedź. Można to również wykorzystać w przypadkach użycia, w których trzeba przesłać wiele plików wraz z ładunkiem JSON w wieloczęściowym ładunku ..
Kiran
To jest najbardziej poprawna odpowiedź, jeśli chcesz wysłać plik, a także dane JSON. Przykłady pokazujące wybór pliku, a następnie przekazanie danych JSON jako pojedynczej wartości ciągu JSON lub dzielenie wartości nie działają (prawdopodobnie w zależności od punktu końcowego, ale nie mogę tego zweryfikować). Wspomina się o tym również tutaj: github.com/postmanlabs/postman-app-support/issues/3331
Anto
8

Jeśli potrzebujesz jak Upload pliku w multipart wykorzystując dane i wysłać formularz json danych (Object Dto) w samym POST Zamówienie

Pobierz swój obiekt JSON jako ciąg w kontrolerze i ustaw go w deserializacji, dodając ten wiersz

ContactDto contactDto  = new ObjectMapper().readValue(yourJSONString, ContactDto.class);
Ajay K.
źródło
1
Czy możesz mi powiedzieć, jakie są używane dwa nagłówki?
Abhisek Roy
Content-Type: application / json Authorization: bearer (yourTokenString)
Ajay k
Tak, zadziałało. Dzięki. Użyłem poniższego kodu i działałem: @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 (wyjątek e) {e.printStackTrace (); }
Anand_5050,
możesz ustawić Content-Type dla contactDtoString na application / json, możesz to zrobić dla każdego klucza
Hritcu Andrei
7

Postman wieloczęściowy typ zawartości danych formularza

Wybierz [Content Type] z [SHOW COLUMNS], a następnie ustaw typ zawartości „application / json” na parametr tekstu json.

otamega
źródło
6

Jeśli ktoś potrzebował:

body -> form-data

Dodaj nazwę pola jako tablicę

wprowadź opis obrazu tutaj

Sebastiao Marcos
źródło
6

Jeśli ktoś chce wysłać dane json w formacie form-data, wystarczy zadeklarować takie zmienne

Listonosz:

Jak widać, parametr opisu będzie miał podstawowy format json, w wyniku czego:

{ description: { spanish: 'hola', english: 'hello' } }
Sebastian Ardila
źródło
2

Musiałem przekazać oba: plik i liczbę całkowitą. Zrobiłem to w ten sposób:

  1. potrzebne do przekazania pliku do przesłania: zrobiono to zgodnie z odpowiedzią Sumita.

    Typ żądania : POST

    Body -> form-data

    pod nagłówkiem KEY wpisałem nazwę zmiennej („plik” w moim kodzie zaplecza).

    w zapleczu:

    file = request.files['file']

    Obok „pliku” znajduje się menu rozwijane, w którym można wybrać „Plik” lub „Tekst”. Wybierz „Plik” i pod nagłówkiem WARTOŚĆ pojawiło się „Wybierz pliki”. Kliknięcie tego, co otworzyło okno do wyboru pliku.

2. potrzebne do przekazania liczby całkowitej:

poszedłem do:

Params

wpisano nazwę zmiennej (np .: id) pod KLUCZ i jej wartość (np .: 1) pod WARTOŚĆ

w zapleczu:

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

Pracowałem!

Vinci mojamdar
źródło
2

Użyj poniższego kodu po stronie podpórki sprężynowej:

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

wprowadź opis obrazu tutaj

Anand_5050
źródło
2

Dla każdego klucza danych formularza można ustawić typ zawartości, po prawej stronie znajduje się przycisk listonosza, aby dodać kolumnę Content-Type, i nie musisz analizować json z ciągu wewnątrz kontrolera.

Hritcu Andrei
źródło
1

Jeśli chcesz złożyć PUTżądanie, zrób wszystko jako POSTżądanie, ale dodaj _method=> PUTdo swoich form-dataparametrów.

kubilay
źródło
0

Jeśli używasz plików cookie do utrzymywania sesji, możesz użyć przechwytywacza, aby udostępnić pliki cookie z przeglądarki do listonosza.

Aby przesłać plik, możesz również użyć zakładki dane formularza pod zakładką treści na listonoszu, w której możesz podać dane w formacie klucz-wartość, a dla każdego klucza możesz wybrać typ tekstu / pliku wartości. po wybraniu typu pliku pojawiła się opcja przesłania pliku.

Sandesh Jain
źródło
2
Za to, co dostajesz 500. czy możesz podać więcej szczegółów
Sandesh Jain