Bagaimana cara mengunggah file dan data JSON di tukang pos?

134

Saya menggunakan Spring MVC dan ini adalah metode saya:

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


Saya harus melewati id sesi di tukang pos dan juga file. Bagaimana saya bisa melakukan itu?

Harikrishnan KN
sumber

Jawaban:

221

Di tukang pos, setel jenis metode ke POST .

Kemudian pilih Tubuh -> formulir-data -> Masukkan nama parameter Anda ( file sesuai dengan kode Anda)

dan di sebelah kanan di sebelah kolom nilai, akan ada dropdown "teks, file" , pilih File . pilih file gambar Anda dan poskan.

Untuk parameter berdasarkan "teks" lainnya , Anda dapat mempostingnya seperti biasanya dengan tukang pos. Cukup masukkan nama parameter dan pilih "teks" dari menu dropdown sisi kanan dan masukkan nilai apa pun untuk itu, tekan tombol kirim. Metode pengontrol Anda harus dipanggil.

Sumaya Badaya
sumber
4
Mengapa POST? Bagaimana dengan PUT?
Hijau
4
Apa yang Anda maksud dengan "Tidak bekerja"? Mengapa Anda tidak menunjukkan kode Anda agar kami dapat men-debug masalah dengan mudah?
Sumit Badaya
2
Saya mendapatkan bagian teks seperti Stringbiasa. Mengapa tidak dipetakan ke DTO saya? @PostMapping ( value = "/byImageFile", consumes = { "multipart/form-data" }) public ResponseEntity<?> postMap( @RequestPart ( "imageFile") MultipartFile imageFile, @RequestPart ( "fieldsToExtract") RequestDto requestDto ) Saya tidak dapat mengirim balasan dari tukang pos sama sekali dalam kasus ini
Arun Gowda
@ArunGowda Cobalah memposting pertanyaan Anda sebagai Pertanyaan baru. Karena berbeda dari poster pertanyaan di sini dan jawaban yang diberikan relevan dengan pertanyaan yang diposting di sini oleh OP.
Sumit Badaya
1
Saya menemukan solusi saya. Itu tidak akan memetakan untuk RequestDtosecara otomatis. Saya menganggapnya sebagai string, mengurai Jsondan memetakannya RequestDtosecara eksplisit.
Arun Gowda
111

Panduan Visual Yang Hilang

Pertama - tama Anda harus menemukan dropdown pucat-abu-ke-putih Fileyang hampir tidak terlihat yang merupakan kunci ajaib yang membuka kunci Choose Filestombol.

Setelah Anda memilih POST, lalu memilih Body->form-data, lalu menemukan dropdown File, dan kemudian pilih 'File', hanya kemudian tombol 'Choose Files' akan muncul secara ajaib:

Penyiapan file POST POST - Dropdown (Teks, File) disorot

Chris F Carroll
sumber
1
Anda benar karena UI ini tidak terlihat oleh yang tidak diinisiasi. Terima kasih untuk versi visualnya!
Vijay
bagaimana jika saya memiliki muatan tubuh XML dan lampiran?
tuxErrante
Jawaban gce tampaknya mengatakan Anda bisa melakukannya dengan cukup? Saya tidak yakin. Anda mungkin harus mempelajari cara menggabungkan lampiran dan XML ke dalam satu dokumen dengan mempelajari tentang format mime multi-bagian. Yang tidak terlalu rumit, Anda dapat membuat tubuh pantomim multipart dengan tangan.
Chris F Carroll
Dua tahun kemudian, UI belum diperbaiki.
Sabuncu
47

Mungkin Anda bisa melakukannya dengan cara ini:

postman_file_upload_with_json

gce
sumber
8
6 header apa yang telah Anda atur di sana?
Hijau
1
Solusi ini bekerja untuk saya. Tidak melewati header apa pun dan berfungsi dengan baik. Terima kasih. Melewati JSON adalah bagian yang sulit bagi saya. :)
Gaurav Sharma
Ha, pintar - mengubah titik akhir saya untuk melakukan itu :) Agak jelek tapi super nyaman
Chris Koston
Bisakah Anda menjelaskan apa yang Anda bicarakan? @ChrisKoston
tlalco
17

Seperti ini :

masukkan deskripsi gambar di sini

Tubuh -> formulir-data -> pilih file

Anda harus menulis "file" bukan "nama"

Anda juga dapat mengirim data JSON dari Tubuh -> bidang mentah. (Cukup rekatkan string JSON)

burakozgul
sumber
3
sebenarnya saya perlu memberikan beberapa nilai dan file dalam tukang pos untuk satu layanan adalah mungkin
Harikrishnan KN
1
Tajuk? header apa yang harus ditetapkan?
Hijau
11
Pertanyaannya meminta untuk mengunggah data json juga, yang tidak tercakup di sini dalam jawaban ini.
Rohit
Cara yang benar untuk melakukan ini: stackoverflow.com/questions/21329426/…
dassum
10
  1. Jangan beri header.
  2. Masukkan data json Anda ke dalam file .json.
  3. Pilih kedua file Anda, satu adalah file .txt Anda dan yang lain adalah file .json untuk kunci param permintaan Anda.
Rohit Thakur
sumber
Ini adalah jawaban yang bagus .. Ini juga dapat digunakan untuk kasus penggunaan di mana banyak file harus diunggah bersama dengan muatan json dalam muatan multi-bagian ..
Kiran
Ini adalah jawaban yang paling benar jika Anda ingin mengirim File serta data JSON. Contoh yang menunjukkan memilih file dan kemudian data JSON yang diteruskan sebagai nilai string JSON tunggal atau membagi nilai-nilai tidak berfungsi (mungkin tergantung pada titik akhir tetapi saya tidak dapat memverifikasi ini). Hal ini juga disebutkan di sini: github.com/postmanlabs/postman-app-support/issues/3331
Anto
8

Jika Anda membutuhkan seperti Upload file di multipart menggunakan formulir data dan kirim json data (Dto objek) di sama POST Permintaan

Dapatkan objek JSON Anda sebagai String di Controller dan membuatnya Deserialize dengan menambahkan baris ini

ContactDto contactDto  = new ObjectMapper().readValue(yourJSONString, ContactDto.class);
Ajay k
sumber
1
Bisakah Anda memberi tahu saya apa yang digunakan dua header?
Abhisek Roy
Content-Type: application / json Otorisasi: bearer (yourTokenString)
Ajay k
Ya itu berhasil. Terima kasih. Saya menggunakan kode di bawah ini dan berfungsi: @PostMapping (nilai = Constant.API_INITIAL + "/ uploadFile") publik UploadFileResponse uploadFile (@RequestParam ("file") file MultipartFile, String jsonFileVo) {FileUploadVo fileUploadVo = null; coba {fileUploadVo = new ObjectMapper (). readValue (jsonFileVo, FileUploadVo.class); } catch (Exception e) {e.printStackTrace (); }
Anand_5050
Anda dapat mengatur Content-Type untuk contactDtoString ke application / json, Anda dapat melakukan ini untuk setiap kunci
Hritcu Andrei
7

Tukang pos multipart formulir-tipe konten data

Pilih [Jenis Konten] dari [TAMPILKAN KOLOM] lalu atur tipe konten "aplikasi / json" ke parameter teks json.

otamega
sumber
6

Jika seseorang membutuhkan:

body -> form-data

Tambahkan nama bidang sebagai array

masukkan deskripsi gambar di sini

Sebastiao Marcos
sumber
6

Jika seseorang ingin mengirim data json dalam format form-data hanya perlu mendeklarasikan variabel seperti ini

Tukang pos:

Seperti yang Anda lihat, parameter deskripsi akan dalam format json dasar, hasil dari itu:

{ description: { spanish: 'hola', english: 'hello' } }
Sebastian Ardila
sumber
2

Saya harus mengirimkan keduanya: file dan integer. Saya melakukannya dengan cara ini:

  1. diperlukan untuk mengirimkan file untuk diunggah: melakukannya sesuai jawaban Sumit.

    Jenis permintaan: POST

    Tubuh -> formulir-data

    di bawah judul KUNCI , masukkan nama variabel ('file' dalam kode backend saya).

    di backend:

    file = request.files['file']

    Di sebelah 'file', ada kotak drop-down yang memungkinkan Anda untuk memilih antara 'File' atau 'Teks'. Memilih 'File' dan di bawah judul VALUE , 'Select files' muncul. Mengklik ini yang membuka jendela untuk memilih file.

2. diperlukan untuk melewati bilangan bulat:

pergi ke:

Params

memasukkan nama variabel (mis .: id) di bawah KUNCI dan nilainya (mis: 1) di bawah VALUE

di backend:

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

Bekerja!

vinci mojamdar
sumber
2

Gunakan kode di bawah ini di sisi sandaran:

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

masukkan deskripsi gambar di sini

Anand_5050
sumber
2

Untuk setiap kunci data formulir, Anda bisa mengatur Content-Type, ada tombol tukang pos di sebelah kanan untuk menambahkan kolom Type-Type, dan Anda tidak perlu mengurai json dari string di dalam Controller Anda.

Hritcu Andrei
sumber
1

Jika Anda ingin membuat PUTpermintaan, lakukan saja semuanya sebagai POSTpermintaan tetapi tambahkan _method=> PUTke form-dataparameter Anda .

kubilay
sumber
0

Jika Anda menggunakan cookie untuk menjaga sesi, Anda dapat menggunakan interseptor untuk membagikan cookie dari browser ke tukang pos.

Juga untuk mengunggah file, Anda dapat menggunakan tab formulir-data di bawah tab badan di tukang pos, Di mana Anda dapat memberikan data dalam format nilai kunci dan untuk setiap tombol Anda dapat memilih jenis teks / file nilai. ketika Anda memilih opsi jenis file muncul untuk mengunggah file.

Sandesh Jain
sumber
2
Untuk apa yang Anda dapatkan 500. bisakah Anda membagikan beberapa rincian lebih lanjut
Sandesh Jain