sirve requestmapping que para mvc modelo modelandview ejemplo basico arquitectura spring rest spring-mvc file-upload

requestmapping - spring basico



RESTO DE RESORTE: la solicitud fue rechazada porque no se encontró un límite de varias partes (4)

Hice un POC para la carga de archivo multipart de spring 3 rest. Funciona bien. Pero cuando intenté integrarme con mi aplicación, tengo problemas.

Lanza la siguiente excepción:

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**"

Por favor, avíseme si me equivoco en alguna parte de mi código.

Frijoles:

<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>

Controlador:

@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"; } }


¿Estás usando algún filtro de seguridad? Mi problema se resolvió quitando la cadena del filtro de seguridad. De esto:

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

a esto:

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

Abrí un problema donde explico los detalles: https://jira.spring.io/browse/SPR-12114


@sermolaev tiene razón en su respuesta.

Quiero compartir mi experiencia relacionada con este problema. He encontrado este problema en Postman, pero no pude entender la causa raíz durante mucho tiempo. Mi plantilla de solicitud parecía ser correcta porque Cartero incluyó el boundary en ella ...

Eventualmente descubrí que cuando especificas Content-Type=multipart/form header por ti mismo, anula el que Postman agrega automáticamente. Y esto lleva al mismo error que el tuyo. Mi solución fue tan simple como eliminar el encabezado Content-Type .


El problema es que está configurando el Content-Type usted mismo, déjelo en blanco. Google Chrome lo hará por ti. El tipo de contenido multiparte necesita conocer el límite del archivo, y cuando elimina el tipo de contenido, el cartero lo hará automáticamente.


El problema no está en tu código, está en tu solicitud. Te faltan límites en tu solicitud multiparte. Como decía en la specification :

El campo Tipo de contenido para entidades multiparte requiere un parámetro, "límite", que se utiliza para especificar el límite de encapsulación. El límite de encapsulación se define como una línea que consiste completamente de dos caracteres de guión ("-", código decimal 45) seguido del valor del parámetro de límite del campo de encabezado de tipo de contenido.

This y this publicación también deberían ser útiles.