Як завантажити файл та дані JSON у листоноші?


134

Я використовую Spring MVC, і це мій метод:

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


Мені потрібно передати ідентифікатор сесії в листоноші, а також файл. Як я можу це зробити?

Відповіді:


221

У листоноші встановіть тип методу POST .

Потім виберіть Тіло -> Форма даних -> Введіть своє ім'я параметра ( файл відповідно до вашого коду)

а праворуч поруч зі стовпцем значення буде спадний текст "текст, файл" , виберіть " Файл" . виберіть свій файл зображення та опублікуйте його.

Для решти параметрів на основі "тексту" ви можете розміщувати його так, як зазвичай ви робите з листоношею. Просто введіть назву параметра та виберіть "текст" у спадному меню правої сторони та введіть будь-яке значення для нього, натисніть кнопку "Надіслати". Ваш метод контролера повинен викликатись.


4
Чому POST? Про що PUT?
Зелений

4
Що ви маєте на увазі під "не працює"? Чому ви не показуєте свій код, щоб ми легко налагоджували проблему?
Суміт Бадая

2
Я отримую текстову частину, як Stringзавжди. Чому це не відповідає моєму DTO? @PostMapping ( value = "/byImageFile", consumes = { "multipart/form-data" }) public ResponseEntity<?> postMap( @RequestPart ( "imageFile") MultipartFile imageFile, @RequestPart ( "fieldsToExtract") RequestDto requestDto ) У цій справі я взагалі не в змозі надіслати запит від листоноші
Arun Gowda

@ArunGowda Спробуйте опублікувати свій запит як нове запитання. Оскільки він відрізняється від плаката запитань тут, і наведена відповідь стосується питання, розміщеного тут ОП.
Суміт Бадая

1
Я знайшов своє рішення. Він не відобразиться RequestDtoавтоматично. Я сприйняв це як рядок, проаналізував Jsonі RequestDtoчітко відобразив його .
Арун Гоуда

112

Відсутній візуальний посібник

Спочатку ви повинні знайти майже невидимий блідо-сіро-білий-білий колір, Fileякий є магічним ключем, який відмикає Choose Filesкнопку.

Після того, як ви вибираєте POST, а потім вибрати Body->form-data, а потім знайти в спадному меню Файл, а потім виберіть «Файл», тільки тоді буде «Вибрати файли» кнопку чарівно з'являються:

Налаштування файлів пошти POST - підсвічується (Текст, Файл)


1
ви вірні в тому, що користувальницький інтерфейс для цього невидимий для неініційованих. Дякую за візуальну версію!
Віджай

що робити, якщо у мене є корисна навантаження тіла XML та додаток?
tuxErrante

Відповідь gce, здається, говорить, що ви можете це легко зрозуміти? Я не впевнений . Можливо, вам доведеться навчитися поєднувати вкладення та XML в єдиний документ, дізнавшись про формат mime з декількома частинами. Що не надто складно, ви можете створити багатомісний корпус міми вручну.
Кріс Ф Керролл

Через два роки інтерфейс користувача не було покращено.
Сабунку

47

Можливо, ви могли це зробити так:

postman_file_upload_with_json


8
Які 6 заголовків ви там встановили?
Зелений

1
Це рішення працює для мене. Не пройшов жодних заголовків, і це працює чудово. Дякую. Передача JSON була для мене складною частиною. :)
Гаурав Шарма

Ха, розумний - змінив свою кінцеву точку, щоб це зробити :) Трохи потворно, але супер зручно
Кріс Костон

Чи можете ви пояснити, про що ви говорите? @ChrisKoston
tlalco

17

Подобається це :

введіть тут опис зображення

Тіло -> дані форми -> виберіть файл

Ви повинні написати "файл" замість "ім'я"

Крім того, ви можете надсилати дані JSON з поля "Тіло ->". (Просто вставте рядок JSON)


3
насправді мені потрібно передати деякі значення та файл у листоноші для однієї послуги - це можливо
Harikrishnan KN

1
Заголовки? які заголовки встановити?
Зелений

11
Питання вимагає також завантаження даних json, які тут не висвітлені у цій відповіді.
Рохіт

Правильний спосіб зробити це: stackoverflow.com/questions/21329426 / ...
dassum

10
  1. Не дайте заголовків.
  2. Помістіть свої дані json у файл .json.
  3. Виберіть обидва файли: один - це ваш .txt-файл, а інший - .json-файл для ваших параметрів запиту.

Це хороша відповідь. Це також можна використовувати для випадків використання, коли потрібно завантажувати декілька файлів разом із json корисним навантаженням у корисному навантаженні з декількох частин ..
Кіран,

Це найправильніша відповідь, якщо ви хочете надіслати файл, а також дані JSON. Приклади, що показують вибір файла, а потім дані JSON, що передаються як єдине значення рядка JSON або розділення значень вгору, не працюють (можливо, залежно від кінцевої точки, але я не можу це перевірити). Тут також згадується: github.com/postmanlabs/postman-app-support/isissue/3331
Анто

8

Якщо вам потрібно, як Завантажити файл у багатопартійному користуванні даними форми та надіслати дані json (об’єкт Dto) у той самий POST- запит

Отримайте ваш об’єкт JSON як String в Controller і зробіть його Deserialize, додавши цей рядок

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

1
Чи можете ви сказати, для чого використовуються два заголовки?
Абхісек Рой

Тип вмісту: application / json Authorization: nositelj (yourTokenString)
Ajay k

Так, це спрацювало. Дякую. Я використовував код нижче і працював: @PostMapping (значення = Constant.API_INITIAL + "/ uploadFile") публічний файл UploadFileResponse uploadFile (@RequestParam ("файл") MultipartFile файл, String jsonFileVo) {FileUploadVo fileUploadVo = null; спробуйте {fileUploadVo = новий ObjectMapper (). readValue (jsonFileVo, FileUploadVo.class); } лов (виняток е) {e.printStackTrace (); }
Anand_5050

ви можете встановити Content-Type для contactDtoString для application / json, це можна зробити для кожної клавіші
Hritcu Andrei

7

Тип контенту для багатоповерхових форм-даних

Виберіть [Тип вмісту] з [SHOW COLUMNS], а потім встановіть тип вмісту "application / json" на параметр тексту json.



6

Якщо хтось хоче надіслати дані json у форматі data-data, просто потрібно оголосити такі змінні

Листоноша:

Як бачите, параметр опису буде в базовому форматі json, результат цього:

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

2

Мені потрібно було передавати обидва: файл і ціле число. Я зробив це так:

  1. потрібно було передати файл для завантаження: зробив це відповідно до відповіді Суміта.

    Тип запиту: POST

    Тіло -> форма-дані

    під заголовком КЛЮЧ введіть назву змінної ('файл' у мій резервний код).

    у вихідному:

    file = request.files['file']

    Поруч із пунктом "файл" є спадне поле, яке дозволяє вибирати "Файл" або "Текст". Оберіть "Файл", а під заголовком " VALUE " з'явилося "Вибрати файли". Натиснувши на це, відкрилося вікно для вибору файлу.

2. потрібно пройти ціле число:

пішов:

Парами

введено ім'я змінної (наприклад: id) під KEY та його значення (наприклад: 1) під VALUE

у вихідному:

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

Працювали!


2

Використовуйте код нижче під час весняного відпочинку:

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

введіть тут опис зображення


2

Для кожного ключа даних форми можна встановити Content-Type, праворуч додається кнопка листоноші, щоб додати стовпець Content-Type, і вам не потрібно буде розбирати json з рядка всередині вашого Controller.


1

Якщо ви хочете зробити PUTзапит, просто виконайте все як POSTзапит, але додайте _method=> PUTдо своїх form-dataпараметрів.


1

Спосіб надсилання даних mulitpart, який містить файл із даними json, полягає в наступному: нам потрібно встановити тип вмісту відповідних полів ключів json на "application / json" на вкладці тіла листоноші таким чином:

Це зображення посилання розповість про надсилання зображення з json даними


0

Якщо ви використовуєте файли cookie для продовження сеансу, ви можете використовувати перехоплювач для обміну файлами cookie від браузера до листоноші.

Також для завантаження файлу можна скористатися вкладкою "Форма даних" під вкладкою "Тіло" на листоноші, в якій ви можете надати дані у форматі "ключ-значення", і для кожної клавіші можна вибрати тип тексту / файла значення. при виборі типу файлу з'явилася опція для завантаження файлу.


2
Що ви отримуєте 500. Чи можете ви поділіться детальніше
Sandesh Jain

-3

погляньте на фотографії, за умови, що ви можете отримати інформацію про контролер, сервіс, програму,
поштальон

будь ласка, не публікуйте зображення коду як своє рішення. Скопіюйте свій код у саму відповідь.
Das_Geek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.