web-dev-qa-db-fra.com

SPRING REST: la demande a été rejetée car aucune limite en plusieurs parties n'a été trouvée.

J'ai fait un POC pour le téléchargement du fichier en plusieurs parties du printemps 3 reste. Cela fonctionne bien. Mais lorsque j'ai essayé d'intégrer mon application, je suis confronté à des problèmes. 

Il jette l'exception suivante:

org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request;
nested exception is org.Apache.commons.fileupload.FileUploadException:
the request was rejected because no multipart boundary was found**"

S'il vous plaît laissez-moi savoir si je me trompe dans une partie de mon code.

Des haricots:

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
 <property name="order" value="1" />
 <property name="mediaTypes">
 <map>
   <entry key="json" value="application/json" />
   <entry key="xml" value="application/xml" />
   <entry key="file" value="multipart/mixed" />
 </map>
</property>
</bean>
<!-- multipart resolver -->
 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
  <!-- one of the properties available; the maximum file size in bytes -->
  <property name="maxUploadSize" value="50000000" />
 </bean>

Manette:

@Controller
public class MultipleFilesRecieve {
    @RequestMapping ( value = "/saveMultiple", method = RequestMethod.POST )
        public String save( FileUploadForm uploadForm ) {
        List<MultipartFile> files = uploadForm.getFiles( );
        List<String> fileNames = new ArrayList<String>( );
        if ( null != files && files.size( ) > 0 ) {
            for ( MultipartFile multipartFile : files ) {
                String fileName = multipartFile.getOriginalFilename( );
                fileNames.add( fileName );
            }
        }
        return "multifileSuccess";
    }
}
25
Cherry

Le problème ne réside pas dans votre code, mais dans votre demande. Il vous manque des limites dans votre demande multipartie. Comme il est dit dans spécification :

Le champ Content-Type pour les entités en plusieurs parties nécessite un paramètre, "frontière", utilisé pour spécifier la limite d'encapsulation. Le La limite d'encapsulation est définie comme une ligne composée entièrement de deux traits d'union ("-", code décimal 45) suivis de la limite valeur de paramètre du champ d'en-tête Content-Type.

Ceci et ceci posts devrait également être utile.

30
sermolaev

@sermolaev a raison dans sa réponse.

Je veux partager mon expérience liée à ce problème. J'ai rencontré ce problème dans Postman, mais je n'ai pas compris la cause du problème pendant très longtemps. Mon modèle de demande semblait être correct car Postman a inclus boundary dans celui-ci ...

En fin de compte, j'ai découvert que lorsque vous spécifiez l'en-tête Content-Type=multipart/form par vous-même, il remplace celui ajouté automatiquement par Postman. Et cela conduit à la même erreur que la vôtre. Ma solution était aussi simple que de supprimer l'en-tête Content-Type.

2
naXa

Ne fournissez pas d'en-tête Content-Type dans la demande. Ça va marcher.

0
Ankit Rai

Utilisez-vous des filtres de sécurité? Mon problème a été résolu en supprimant la chaîne de filtres de sécurité. De ceci: 

this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).addFilters(this.springSecurityFilterChain).build();

pour ça:

this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();

J'ai ouvert un numéro où j'explique les détails: https://jira.spring.io/browse/SPR-12114

0
unify