Как загрузить файл и данные JSON в Postman?

136

Я использую 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;
        }
    }
}


Мне нужно передать идентификатор сеанса в почтальоне, а также файл. Как я могу это сделать?

Харикришнан К.Н.
источник

Ответы:

223

В почтальоне установите для типа метода значение POST .

Затем выберите Body -> form-data -> Введите имя вашего параметра ( файл в соответствии с вашим кодом)

а справа от столбца значений будет раскрывающийся список «текст, файл» , выберите « Файл» . выберите файл изображения и опубликуйте его.

Остальные параметры , основанные на "тексте" , можно опубликовать как обычно с почтальоном. Просто введите имя параметра, выберите «текст» в раскрывающемся меню справа и введите для него любое значение, нажмите кнопку «Отправить». Ваш метод контроллера должен быть вызван.

Сумит Бадая
источник
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 ) В этом случае я вообще не могу отправить запрос от почтальона
Арун Гауда
@ArunGowda Попробуйте опубликовать свой запрос как новый вопрос. Поскольку он отличается от плаката с вопросом здесь, и данный ответ относится к вопросу, размещенному здесь OP.
Сумит Бадая
1
Я нашел свое решение. Он не будет отображаться RequestDtoавтоматически. Я принял его как строку, проанализировал Jsonи RequestDtoявно сопоставил .
Arun Gowda
113

Отсутствующее наглядное руководство

Сначала вы должны найти почти невидимое раскрывающееся меню бледно-серого цвета на белом, для Fileкоторого есть волшебный ключ, открывающий Choose Filesкнопку.

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

Настройка файла Postman POST - (Текст, Файл) выделен раскрывающийся список

Крис Ф. Кэрролл
источник
1
вы правы в том, что пользовательский интерфейс для этого невидим для непосвященных. Спасибо за визуальную версию!
Виджай
что, если у меня есть полезная нагрузка тела XML и вложение?
tuxErrante,
Ответ gce, кажется, говорит, что вы можете сделать это достаточно легко? Я не уверен . Возможно, вам придется узнать, как объединить вложение и XML в единый документ, узнав о многокомпонентном формате mime. Что не слишком сложно, вы можете создать составное тело пантомимы вручную.
Крис Ф. Кэрролл,
Два года спустя пользовательский интерфейс так и не был улучшен.
Сабунджу
47

Может быть, вы могли бы сделать это так:

postman_file_upload_with_json

GCE
источник
8
Какие 6 заголовков вы там установили?
Грин
1
Это решение мне подходит. Заголовки не прошли, и все работает нормально. Спасибо. Передача JSON была для меня сложной задачей. :)
Гаурав Шарма
Ха, умно - для этого сменил мою конечную точку :) Немного некрасиво, но очень удобно
Крис Костон
Вы можете объяснить, о чем говорите? @ChrisKoston
tlalco
17

Как это :

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

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

Вы должны написать «файл» вместо «имя»

Также вы можете отправлять данные JSON из поля Body -> raw. (Просто вставьте строку JSON)

burakozgul
источник
3
на самом деле мне нужно передать некоторые значения и файл в почтальоне для одной услуги, это возможно,
Харикришнан К.Н.
1
Заголовки? какие заголовки установить?
Грин
11
Вопрос также требует загрузки данных json, что не рассматривается здесь в этом ответе.
Rohit
Правильный способ сделать это: stackoverflow.com/questions/21329426/…
dassum
10
  1. Не давайте никаких заголовков.
  2. Поместите свои данные json в файл .json.
  3. Выберите оба файла: один - это ваш файл .txt, а другой - файл .json для ключей параметров вашего запроса.
Рохит Такур
источник
Это хороший ответ .. Это также можно использовать для случаев, когда необходимо загрузить несколько файлов вместе с полезной нагрузкой json в многослойной полезной нагрузке ..
Киран
Это наиболее правильный ответ, если вы хотите отправить как файл, так и данные JSON. Примеры, показывающие выбор файла, а затем данные JSON, передаваемые в виде одного строкового значения JSON или разделение значений, не работают (возможно, в зависимости от конечной точки, но я не могу это проверить). Это также упоминается здесь: github.com/postmanlabs/postman-app-support/issues/3331
Anto
8

Если вам нужно как Upload файл в многоголосном с помощью формы данных и отправить JSON данные (объект Dto) в том же POST запроса

Получите объект JSON как String в контроллере и сделайте его десериализованным, добавив эту строку

ContactDto contactDto  = new ObjectMapper().readValue(yourJSONString, ContactDto.class);
Аджай К
источник
1
Вы можете сказать мне, какие два заголовка используются?
Абхисек Рой
Content-Type: application / json Authorization: bearer (yourTokenString)
Аджай К.
Да, это сработало. Спасибо. Я использовал приведенный ниже код и работал: @PostMapping (value = Constant.API_INITIAL + "/ uploadFile") public UploadFileResponse uploadFile (@RequestParam ("file") MultipartFile file, String jsonFileVo) {FileUploadVo fileUploadVo = null; попробуйте {fileUploadVo = new ObjectMapper (). readValue (jsonFileVo, FileUploadVo.class); } catch (исключение e) {e.printStackTrace (); }
Anand_5050
вы можете установить Content-Type для contactDtoString на application / json, вы можете сделать это для каждого ключа
Hritcu Андрей
7

Почтальон составной тип содержимого формы-данных

Выберите [Content Type] из [SHOW COLUMNS], затем установите тип контента «application / json» для параметра текста json.

otamega
источник
6

Если кому-то понадобилось:

тело -> данные формы

Добавить имя поля как массив

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

Себастьяно Маркос
источник
6

Если кто-то хочет отправить данные json в формате данных формы, просто нужно объявить такие переменные

Почтальон:

Как видите, параметр description будет в базовом формате json, в результате чего:

{ description: { spanish: 'hola', english: 'hello' } }
Себастьян Ардила
источник
2

Мне нужно было передать и файл, и целое число. Я сделал это так:

  1. необходимо передать файл для загрузки: сделал это в соответствии с ответом Sumit.

    Тип запроса : POST

    Тело -> данные формы

    под заголовком KEY имя переменной («файл» в моем внутреннем коде).

    в бэкэнде:

    file = request.files['file']

    Рядом с «файлом» есть раскрывающийся список, в котором можно выбрать между «Файл» или «Текст». Выберите «Файл», и под заголовком ЗНАЧЕНИЕ появилось «Выбрать файлы». Щелкнул по нему, открыв окно для выбора файла.

2. необходимо передать целое число:

пошел в:

Params

введенное имя переменной (например: 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();
        }

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

Anand_5050
источник
2

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

Хритку Андрей
источник
1

Если вы хотите сделать PUTзапрос, просто сделайте все как POSTзапрос, но добавьте _method=> PUTк своим form-dataпараметрам.

Kubilay
источник
1

Способ отправки данных mulitpart, содержащих файл с данными json, следующий: нам нужно установить тип содержимого соответствующих полей ключа json на 'application / json' на вкладке тела почтальона, как показано ниже:

Это изображение ссылки расскажет вам об отправке изображения с данными json.

Ахсан Фарук
источник
0

Если вы используете файлы cookie для сохранения сеанса, вы можете использовать перехватчик для передачи файлов cookie от браузера к почтальону.

Также для загрузки файла вы можете использовать вкладку данных формы на вкладке тела почтальона, в которой вы можете предоставить данные в формате ключ-значение, и для каждого ключа вы можете выбрать тип значения текст / файл. при выборе типа файла появилась опция загрузки файла.

Сандеш Джайн
источник
2
За то, что вы получаете 500. Не могли бы вы поделиться некоторыми подробностями?
Сандеш Джайн,
-3

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

оставшийся контроллер [класс сервиса applicationinitializer class for multipart con [postman pic] 2 fig

SMK
источник
посмотрите картинки, которые я предоставил, и вы можете получить информацию о контроллере, сервисе, аппинитизаторе, почтальоне
smk
пожалуйста, не размещайте изображения кода в качестве своего решения. Скопируйте свой код в сам ответ.
Das_Geek