1
resposta

Upload foto para S3

Boa noite galera.

Estou tentando realizar um upload de uma foto que tirei com o componente de Camera do Ionic, realizando uma chamada PUT para um RestController no Spring Boot. Essa requisição, contém outros campos além da foto. (Tela de atualização de dados).

Quando tento fazer o upload, está dando erro:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.springframework.web.multipart.MultipartFile` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information  at [Source: (PushbackInputStream); line: 149, column: 16] (through reference chain: br.com.ex.Account["imageFile"])

Segue código do Ionic e Spring Boot:

    takePicture() {

      Picture.takePhoto()

        .then(imageFileUri => {

            this.handleImageFile(imageFileUri);

        }).catch(
            error => console.log(JSON.stringify(error))
        );
      }

    private handleImageFile(imageFileUri) {

        this.file.resolveLocalFilesystemUrl(imageFileUri)
        .then(entry => (<FileEntry>entry).file(file => this.readFile(file)))
        .catch(err => console.log(err));
    }

    private readFile(file: any) {

        const reader = new FileReader();

        reader.onloadend = () => {
            const formData = new FormData();
            const imageBlob = new Blob([reader.result], {type: file.type});
            formData.append('file', imageBlob, file.name);

            this.myAccount.imageFile = formData;
        };

        reader.readAsArrayBuffer(file);
    }

Aqui faço a chamada ao serviço Rest:

    updateAccount(account : Account) : Observable<Response> {

        let url = Endpoint + '/update';

        //Aqui seto uns valores
        this.createBodyForUpdate(account);

        return this.http.put(url, account, Utils.getOptionsToRequest());
    }

Serviço Rest:

@PutMapping(value = "/update")
public ResponseEntity<String> update(@RequestBody final Account account) {}

É nessa chamada que estoura o erro mencionado acima.

O campo da foto está na propriedade: private MultipartFile imageFile; da classe Account

Todos os demais campos são setados normalmente e funciona corretamente quando não tento passar a foto. Alguém tem ideia do que pode estar acontecendo?

1 resposta

Oi Educardo, tudo bem? Pelo que estou vendo no erro, o problema está no seu serviço rest, ele não tá conseguindo deserializar a imagem.

No curso de Spring MVC temos uma aula sobre upload de arquivos, que tal dar uma olhada pra ver se tem algo lá que pode te ajudar: https://cursos.alura.com.br/course/spring-mvc-1-criando-aplicacoes-web/task/40209