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

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.


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)


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


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)


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.

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

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.



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

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!


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


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.


1

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



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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.