Como fazer upload de um arquivo e dados JSON no Postman?

134

Estou usando o Spring MVC e este é o meu método:

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


Eu preciso passar a identificação da sessão no carteiro e também o arquivo. Como eu posso fazer isso?

Harikrishnan KN
fonte

Respostas:

221

No carteiro, defina o tipo de método como POST .

Em seguida, selecione Corpo -> dados do formulário -> Digite o nome do seu parâmetro ( arquivo de acordo com o seu código)

e no lado direito ao lado da coluna de valor, haverá o menu suspenso "texto, arquivo" , selecione Arquivo . escolha seu arquivo de imagem e publique-o.

Para o restante dos parâmetros baseados em "texto" , você pode publicá-lo como normalmente faz com o carteiro. Basta digitar o nome do parâmetro e selecionar "texto" no menu suspenso do lado direito e inserir qualquer valor para ele. Clique no botão Enviar. Seu método de controle deve ser chamado.

Sumit Badaya
fonte
4
Por que POST? Que tal PUT?
Verde
4
O que você quer dizer com "Não funciona"? Por que você não mostra seu código para que possamos depurar facilmente o problema?
Sumit Badaya
2
Recebo a parte do texto como Stringsempre. Por que ele não é mapeado para o meu DTO? @PostMapping ( value = "/byImageFile", consumes = { "multipart/form-data" }) public ResponseEntity<?> postMap( @RequestPart ( "imageFile") MultipartFile imageFile, @RequestPart ( "fieldsToExtract") RequestDto requestDto ) Iam não é capaz de enviar o requesst do carteiro em todo este caso
Arun Gowda
@ArunGowda Tente postar sua consulta como nova pergunta. Como é diferente do cartaz da pergunta aqui e a resposta dada é relevante para a pergunta postada aqui pelo OP.
Sumit Badaya
1
Encontrei minha solução. Não será mapeado RequestDtoautomaticamente. Eu peguei como uma string, analisei Jsone mapeei RequestDtoexplicitamente.
Arun Gowda
111

O guia visual ausente

Você deve primeiro encontrar o menu suspenso quase invisível de cinza pálido sobre branco, para o Filequal é a chave mágica que desbloqueia o Choose Filesbotão.

Depois que você escolher POST, em seguida, escolher Body->form-data, em seguida, encontrar o menu suspenso Arquivo e, em seguida, escolha 'File', só então será o 'Escolha Files' botão magicamente aparecer:

Configuração do arquivo POST do Postman - menu suspenso (Texto, Arquivo) destacado

Chris F Carroll
fonte
1
você está certo de que a interface do usuário é invisível para os não iniciados. Obrigado pela versão visual!
Vijay
e se eu tiver uma carga útil do corpo XML e o anexo?
tuxErrante 23/03
A resposta de gce parece dizer que você pode fazê-lo facilmente o suficiente? Não tenho certeza . Pode ser necessário aprender a combinar o anexo e o XML em um único documento, aprendendo sobre o formato MIME de várias partes. O que não é muito complicado, você pode criar um corpo mimo de várias partes manualmente.
Chris F Carroll
Dois anos depois, a interface do usuário não foi aprimorada.
Sabuncu
47

Talvez você possa fazer desta maneira:

postman_file_upload_with_json

gce
fonte
8
Quais 6 cabeçalhos você definiu lá?
Verde
1
Esta solução funciona para mim. Não passou nenhum cabeçalho e está funcionando bem. Obrigado. Passar JSON foi a parte mais complicada para mim. :)
Gaurav Sharma
Ah, inteligente - mudei meu endpoint para fazer isso :) Um pouco feio, mas super conveniente #
Chris Koston
Você pode explicar do que está falando? @ChrisKoston
tlalco
17

Como isso :

insira a descrição da imagem aqui

Corpo -> dados do formulário -> selecionar arquivo

Você deve escrever "arquivo" em vez de "nome"

Além disso, você pode enviar dados JSON do corpo -> campo bruto. (Basta colar a string JSON)

burakozgul
fonte
3
na verdade eu preciso para passar alguns valores e arquivo em carteiro por um serviço é que possível
Harikrishnan KN
1
Cabeçalhos? quais cabeçalhos definir?
Verde
11
A pergunta também faz o upload de dados json, que não são abordados aqui nesta resposta.
Rohit
A maneira correta de fazer isso: stackoverflow.com/questions/21329426/...
dassum
10
  1. Não dê nenhum cabeçalho.
  2. Coloque seus dados json dentro de um arquivo .json.
  3. Selecione os dois arquivos, um é o arquivo .txt e o outro é o arquivo .json para as chaves param de sua solicitação.
Rohit Thakur
fonte
Esta é uma resposta boa .. Isso também pode ser usado para casos de uso onde múltiplos arquivos tem de ser carregado junto com uma carga útil json em uma carga multi-parte ..
Kiran
Esta é a resposta mais correta se você deseja enviar um arquivo e dados JSON. Os exemplos que mostram a seleção de um arquivo e os dados JSON transmitidos como um único valor de string JSON ou a divisão dos valores não funcionam (possivelmente dependendo do ponto final, mas não posso verificar isso). Também é mencionado aqui: github.com/postmanlabs/postman-app-support/issues/3331
Anto
8

Se você precisar enviar o arquivo em várias partes usando dados do formulário e enviar dados json (objeto Dto) na mesma solicitação POST

Obtenha seu objeto JSON como String no Controller e faça a desserialização adicionando esta linha

ContactDto contactDto  = new ObjectMapper().readValue(yourJSONString, ContactDto.class);
Ajay k
fonte
1
Você pode me dizer quais são os dois cabeçalhos usados?
Abhisek Roy
Tipo de conteúdo: application / json Autorização: portadora (yourTokenString)
k
Sim, funcionou. Obrigado. Usei o código abaixo e trabalhei: @PostMapping (value = Constant.API_INITIAL + "/ uploadFile") public UploadFileResponse uploadFile (@RequestParam ("file") Arquivo MultipartFile, String jsonFileVo) {FileUploadVo fileUploadVo = null; tente {fileUploadVo = new ObjectMapper (). readValue (jsonFileVo, FileUploadVo.class); } catch (Exceção e) {e.printStackTrace (); }
Anand_5050
você pode definir o tipo de conteúdo para contactDtoString como application / json; isso pode ser feito para todas as chaves
Hritcu Andrei
7

Tipo de conteúdo de dados de formulário multipartes do carteiro

Selecione [Tipo de conteúdo] em [MOSTRAR COLUNAS] e defina o tipo de conteúdo de "application / json" como o parâmetro do texto json.

otamega
fonte
6

Se alguém precisasse:

corpo -> dados do formulário

Adicionar nome do campo como matriz

insira a descrição da imagem aqui

Sebastiao Marcos
fonte
6

Se alguém quiser enviar dados json no formato form-data, basta declarar as variáveis ​​como esta

Carteiro:

Como você vê, o parâmetro description estará no formato json básico, resultado disso:

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

Eu precisava passar os dois: um arquivo e um número inteiro. Eu fiz assim:

  1. necessário passar um arquivo para fazer o upload: faça-o conforme a resposta de Sumit.

    Tipo de solicitação: POST

    Corpo -> dados do formulário

    sob o cabeçalho KEY , digite o nome da variável ('arquivo' no meu código de back-end).

    no back-end:

    file = request.files['file']

    Ao lado de 'arquivo', há uma caixa suspensa que permite escolher entre 'Arquivo' ou 'Texto'. Escolha 'Arquivo' e, sob o título VALUE , 'Selecionar arquivos' aparecerá. Clicou nele para abrir uma janela para selecionar o arquivo.

2. necessário para passar um número inteiro:

frequentou:

Params

digitou o nome da variável (por exemplo: id) em KEY e seu valor (por exemplo: 1) em VALUE

no back-end:

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

Trabalhou!

vinci mojamdar
fonte
2

Use o código abaixo no lado de descanso da mola:

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

insira a descrição da imagem aqui

Anand_5050
fonte
2

Para cada chave de dados do formulário, você pode definir o Tipo de Conteúdo, existe um botão carteiro à direita para adicionar a coluna Tipo de Conteúdo, e você não precisa analisar um json de uma sequência dentro de seu Controlador.

Hritcu Andrei
fonte
1

Se você deseja fazer uma PUTsolicitação, faça tudo como uma POSTsolicitação, mas adicione _method=> PUTaos seus form-dataparâmetros.

kubilay
fonte
1

A maneira de enviar dados de várias partes que contêm um arquivo com os dados json é a seguinte: precisamos definir o tipo de conteúdo dos respectivos campos da chave json como 'application / json' na guia body do postman, como a seguir:

Esta imagem de link informará sobre o envio da imagem com dados json

Ahsan Farooq
fonte
0

Se você estiver usando cookies para manter a sessão, poderá usar o interceptador para compartilhar cookies do navegador para o carteiro.

Também para fazer upload de um arquivo, você pode usar a guia form-data na guia body no carteiro, na qual é possível fornecer dados no formato de valor-chave e, para cada chave, é possível selecionar o tipo de valor texto / arquivo. quando você seleciona o tipo de arquivo, a opção apareceu para fazer o upload do arquivo.

Sandesh Jain
fonte
2
Para o que você está recebendo 500. você pode por favor compartilhar mais alguns detalhes
Sandesh Jain