[JAVA] [Spring Boot] Publiez des fichiers et d'autres données en même temps [Axios]

Choses à faire

Les fichiers tels que les images et les données converties JSON sont POSTés en même temps en utilisant ʻaxios`, et le mappage et la validation des objets sont effectués du côté Spring. De la même manière, vous devriez pouvoir envoyer toutes les données qui peuvent être analysées du côté Spring en même temps.

Exécuter

Côté Java

Les points finaux sont: L'astuce consiste à utiliser @ RequestPart. Il prend des valeurs entières, des fichiers et des objets JSON et les génère pour chacun.

point final


@PostMapping("/api/sample")
public void sample(
        @RequestParam("intValue") Integer intValue,
        @RequestPart("file") MultipartFile multipartFile,
        @RequestPart("jsonValue") @Valid SampleObject sampleObject,
        BindingResult bindingResult
) {
    if(bindingResult.hasErrors()) {
        //La gestion des erreurs
        System.out.println(bindingResult.getAllErrors());
    }

    System.out.println(intValue);
    System.out.println(multipartFile.getOriginalFilename());
    System.out.println(sampleObject.getName());
}

Les objets à recevoir sont les suivants.

objet


@Getter @Setter
public class SampleObject {
    @NotBlank
    private String name;
    @NotNull
    private String description;
}

Côté JS

Le code pour POST est le suivant [^ indent]. La clé est de spécifier "type:" application / json "dans" new Blob ". Voir les commentaires pour savoir quoi envoyer.

POST


postSample (file) { //Faire passer le fichier en argument
  const sampleObject = { //L'objet doit être JSON
    name: 'name',
    description: null //Accrocher la validation en définissant la description sur null
  }

  const formData = new FormData()
  formData.append('file', file)
  formData.append('jsonValue', new Blob([JSON.stringify(sampleObject)], {type : 'application/json'}))
  formData.append('intValue', '1') //spécifiez 1 pour intValue

  axios.post('/api/sample', formData)
}

Résultat d'exécution

J'ai envoyé un fichier appelé 1.png. Vous pouvez voir qu'il peut être traité correctement, y compris les erreurs.

[Field error in object 'jsonValue' on field 'description': rejected value [null]; codes [NotNull.jsonValue.description,NotNull.description,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [jsonValue.description,description]; arguments []; default message [description]]; default message [must not be null]]
1
1.png
name

Code qui échoue

Si vous ne spécifiez pas type: 'application / json, vous vous fâcherez contre ʻorg.springframework.web.HttpMediaTypeNotSupportedException: Type de contenu'application / octet-stream' non prise en charge de la partie de requête. ʻApplication / octat-stream signifie que la méthode de transmission n'est pas spécifiée, et si vous spécifiez JSON ici, cela fonctionnera correctement.

[^ indent]: style 2 espaces indent sans point-virgule.

Recommended Posts

[Spring Boot] Publiez des fichiers et d'autres données en même temps [Axios]
[Spring Boot] Tableau / liste de fichiers POST et autres données en même temps [Axios]
Spring Boot pour la première fois
Méthode de mise en œuvre consistant à lier plusieurs images à un article et à publier en même temps
Dessinez un graphique à barres et un graphique linéaire en même temps avec MPAndroidChart
Comportement remarqué lors de l'ajout de RadioButton et de la vérification initiale en même temps dans le code
Vérifiez le comportement de getOne, findById et des méthodes de requête avec Spring Boot + Spring Data JPA
Jusqu'à l'utilisation de Spring Data et JPA Part 2
Jusqu'à l'utilisation de Spring Data et JPA Part 1
[Java] Erreur d'appel de méthode lorsque l'héritage et l'implémentation de l'interface sont effectués en même temps
Comment utiliser la même classe Mapper dans plusieurs sources de données avec Spring Boot + MyBatis
Comment modifier la valeur de paramètre de application.properties au moment du démarrage dans Spring Boot
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
[Spring Boot] Validation du déplacement (@Validated / @Valid) à tout moment [BeanValidation]
[Spring Data JPA] L'ID personnalisé est attribué dans une séquence unique au moment de l'enregistrement.
Lancez webpack-dev-server et docker-compose en même temps sur le terminal Windows et affichez-les dans un autre volet
À peu près la même et la même valeur
Vérifiez la date et l'heure réelles lors de l'analyse avec SimpleDateFormat de Java
Téléchargement et téléchargement de fichiers à l'aide d'Ajax avec Spring Boot (sans JQuery)
Voir le comportement des mises à jour d'entités avec Spring Boot + Spring Data JPA
Lock_version peut être utilisé pour les tables qui ont tendance à accéder et à modifier le même enregistrement en même temps