Voy a enviar varios archivos con formData
como esto
En mi controlador MVC primavera
@PostMapping(value = "/marches")
public Integer saveMarches(
@RequestPart("formJson") FooBean formJson,
@RequestPart("attachOs") MultipartFile[][] attachOs
) throws IOException {
...
}
Mi conf:
@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(30000000);
return multipartResolver;
}
Pero tengo una 400 Bad Request
en el navegador
Y en el IDE que tengo:
Resolved [org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'attachOs' is not present]
y si trato @RequestPart("attachOs[][]") MultipartFile[][] attachOs
que me dieron siempre una mala solicitud conRequired request part 'attachOs[][]' is not present
El problema es obvio : la primavera está buscando sólo para attachOs
una parte ( @RequestPart("attachOs")
) pero estoy enviando attachOs[0][0]
, attachOs[0][1]
...
Cuando envío sólo la formJson
parte sin archivos o si envío un solo archivo @RequestPart("attachOs") MultipartFile attachOs
o una matriz de dimensión archivos @RequestPart("attachOs") MultipartFile[] attachOs
todo funciona bien.
código Javascript:
const formData = new FormData();
for (const [i, os] of formJson.os.entries()) {
if(os.attachment) {
for (const [j, file] of [...os.attachment].entries()) {
formData.append(`attachOs[${i}][${j}]`, file );
}
}
}
...
formData.append('formJson',
new Blob([JSON.stringify(formJson)], {type:'application/json'}));
...
axios({
url: ...,
method: 'POST',
data: formData,
})
...
Mi formJson
estructura es
{
// form fields
...
os: [
{
// os form fields
...
attachment: [{ /* File type */ }, ...], // multiple files per os
},
...
]
}
Yo sé que los archivos no pueden ser enviados junto con JSON Es por eso que estoy construyendo el FormData arriba y después de eso voy a eliminar la propiedad de fijación de la estructura JSON
Así que mis preguntas:
1. ¿Cómo se soluciona el problema de la petición malo?
2. ¿Hay otro patrón de enfoque o el diseño para manejar este caso de uso?
He encontrado una solución mediante la utilización de una @ModelAttribute
(de aquí );
En primer lugar crear una clase del modelo similares;
public class MyRequest {
private FooBean formJson;
private MultipartFile[][] attachOs = new MultipartFile[2][2];
// getters/setters
}
A continuación, agregarlo a su controlador similares;
@PostMapping(value = "/marches", consumes = "multipart/form-data")
public Integer saveMarches(@ModelAttribute MyRequest request) throws IOException {
// some code
}
La parte importante es la inicialización de la MultipartFile[][] attachOs
, de lo contrario no funciona con matrices multidimensionales debido a algún problema de inicialización interna.
O puede utilizar el siguiente tipo en la clase del modelo;
private List<MultipartFile>[] attachOs;
que funciona sin una inicialización.