web-dev-qa-db-fra.com

Téléchargement de fichier de printemps - "La partie requête requise n'est pas présente"

J'essaie d'envoyer une demande POST à mon contrôleur, mais je ne peux transmettre aucun paramètre, quel que soit son type, à moins que je ne décide d'utiliser JSON. Mon but est de passer une chaîne et un fichier à mon contrôleur mais je continue à avoir l'erreur Required request part 'xxx' is not present.

@RestController
public class ConfigurationController {
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("file") MultipartFile uploadfile){
        return ResponseEntity.ok().body(null);
    }
}

Je ne peux pas avoir de fichier ici. De même si j'essaye:

@RestController
public class ConfigurationController {
    @PostMapping(value = "/config")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("name") String name){
        return ResponseEntity.ok().body(null);
    }
}

même chose je ne peux pas obtenir le nom ici. 

J'envoie une demande via Postman comme indiqué dans la capture d'écran suivante:

 Postman Request

 Postman Request 2

La seule balise d'en-tête est pour l'autorisation. Je n'ai pas d'en-tête Content-Type, j'ai essayé d'ajouter multipart/form-data mais je n'ai pas aidé.

La seule façon pour moi de passer le paramètre String est en ajoutant à l'URL. Donc, suivre http://localhost:8080/SearchBox/admin/config?name=test fonctionne mais ce n’est pas ce que je veux. Je veux les paramètres String et File dans la partie Body. 

J'ai aussi testé via CURL:

curl -X POST -H "Authorization:Bearer myToken" -H "Content-Type:Multipart/form-data" http://localhost:8080/SearchBox/admin/config --data 'pwd=pwd'
curl -X POST -H "Authorization:Bearer myToken"http://localhost:8080/SearchBox/admin/config --data 'pwd=pwd'
curl -H "Authorization:Bearer myToken" -F file=@"/g123.conf" http://localhost:8080/SearchBox/admin/config

Note: J'ai déjà vérifié des publications similaires mais je n'ai pas aidé Ce , Ce , Ce

5
Gokhan Celikkaya

J'ai finalement résolu le problème et partagé ma solution au cas où quelqu'un d'autre pourrait faire face au même problème. 

@RestController
@RequestMapping("/")
public class ConfigurationController {

    @Bean
    public MultipartConfigElement multipartConfigElement() {
        return new MultipartConfigElement("");
    }

    @Bean
    public MultipartResolver multipartResolver() {
        org.springframework.web.multipart.commons.CommonsMultipartResolver multipartResolver = new org.springframework.web.multipart.commons.CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(1000000);
        return multipartResolver;
    }
    @PostMapping(value = "/config", consumes = "multipart/form-data")
    public ResponseEntity<?> saveEnvironmentConfig(@RequestParam("password") String password, @RequestParam("file") MultipartFile submissions)
            throws AdminAuthenticationException, ConfigurationException {
        return ResponseEntity.ok().body(null);
    }
}
9
Gokhan Celikkaya
@RequestMapping(value = "/upload", method = RequestMethod.POST)
public ResponseEntity<?> upload(@RequestParam(value = "name") String 
name,@RequestParam(value = "file") MultipartFile file){
    // TODO check file is not null and save 
    return new ResponseEntity<>(HttpStatus.valueOf(200));;
}

 enter image description here

2
baba

Je soupçonne que la raison principale est @RequestParam ("fichier") Il devrait plutôt y avoir @RequestBody.

1

Bien que ce ne soit pas le problème de l'affiche d'origine, si vous trouvez cette question et qu'aucune des solutions ci-dessus ne vous convient, vérifiez les en-têtes de votre postier; Si l'en-tête "Content-Type" est défini, cela peut entraîner l'erreur ci-dessus.

Supprimez l'en-tête "Content-Type" et cela peut résoudre le problème ci-dessus.

Voir cette question pour plus d'informations:

Postman: La partie requête requise 'le fichier' n'est pas présent

0
drew

Ajouter un bean au fichier de configuration.

@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(-1);
    return multipartResolver;

}
0
Mahendra Sri

Pensez également à la possibilité que le corps de votre demande n'atteigne pas votre serveur s'il passe par un proxy ou tout autre intermédiaire qui ne prend peut-être pas en charge les types de contenu multipart/form-data ou même octet-stream. Espérons que cela puisse être résolu avec une configuration supplémentaire pour traiter ce type de demandes. Je peux également vous recommander de configurer un intercepteur de demande afin que vous puissiez enregistrer votre demande avant et après votre contrôleur. Cela peut vous aider à avoir un aperçu des paramètres de la demande, de la charge utile et des en-têtes. Dans mon cas, j'ai réalisé que la taille du corps de ma requête était 0, ce qui m'a aidé à détecter la cause de cette erreur qui n'était pas ma configuration de ressort. Ici je laisse une ressource utile pour vous aider avec l'intercepteur de journalisation que Spring a sorti de la boîte. entrez la description du lien ici

0
darkconeja