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.