Directorio de artículos
1. Reproducir el problema
Hoy, estoy haciendo la función de cargar archivos.El código de back-end es el siguiente:
/**
* @author 念兮为美
* @datetime 2022/12/8 16:12
* @desc 文件控制器
*/
@Api(tags = "文件模块")
@RestController
@RequestMapping("/file")
@Slf4j
public class FileController {
@Autowired private FileService fileService;
@Autowired private JwtTokenProvider jwtTokenProvider;
@ApiOperationSupport(author = "念兮为美")
@ApiOperation(value = "文件上传")
@PostMapping("/upload")
@LogAnnotation
public ReturnResult upload(
@RequestHeader(value = REQUEST_HEADER_TOKEN) String token,
@Validated @RequestBody UploadDto uploadDto,
BindingResult bindingResult) {
BindingParamUtil.checkParam(bindingResult);
TokenProperties tokenProperties = jwtTokenProvider.parseToken(token);
ReturnResult upload = fileService.upload(uploadDto, tokenProperties);
return upload;
}
}
Pero postman
al usar la prueba, se informa el siguiente error:
El mensaje de error específico informado por el backend es el siguiente:
es decir, Content type 'multipart/form-data;boundary=--------------------------036764477110441760467042;charset=UTF-8' not supported
el error.
2. Analizando el problema
Traduce el mensaje de error anterior al chino 不支持'multipart/form-data;boundary=--------------------------036764477110441760467042;charset=UTF-8'请求类型
.
¿Por qué no se admite este tipo?
Resulta que cuando subimos un archivo, spring
el framework ensamblará automáticamente el tipo de archivo y utilizará @RequestBody
el objeto receptor correspondiente content-type :application/json
. Entonces, al usar @RequestBody
y cargar archivos, se informará un error.
3. Resuelve el problema
Hay dos soluciones:
- borrar
@RequestBody
comentario
Dado que no se puede usar al cargar un archivo, @RequestBody
elimine @RequestBody
la anotación, como se muestra en el siguiente código:
@ApiOperationSupport(author = "念兮为美")
@ApiOperation(value = "文件上传")
@PostMapping("/upload")
@LogAnnotation
public ReturnResult upload(
@RequestHeader(value = REQUEST_HEADER_TOKEN) String token,
@Validated UploadDto uploadDto,
BindingResult bindingResult) {
BindingParamUtil.checkParam(bindingResult);
TokenProperties tokenProperties = jwtTokenProvider.parseToken(token);
ReturnResult upload = fileService.upload(uploadDto, tokenProperties);
return upload;
}
Después de eliminar @RequestBody
la anotación, el archivo se puede cargar correctamente.
- Usar
@RequestParam
anotaciones
@RequestParam
Reemplace anotaciones con anotaciones , @RequestBody
como se muestra en el siguiente código:
@ApiOperationSupport(author = "念兮为美")
@ApiOperation(value = "文件上传")
@PostMapping("/upload")
@LogAnnotation
public ReturnResult upload(
@RequestHeader(value = REQUEST_HEADER_TOKEN) String token,
@RequestParam("file") MultipartFile file,
@RequestParam("fileType") String fileType) {
TokenProperties tokenProperties = jwtTokenProvider.parseToken(token);
UploadDto uploadDto = new UploadDto(file, fileType);
ReturnResult upload = fileService.upload(uploadDto, tokenProperties);
return upload;
}
Después de que el cartero vuelva a probar las dos soluciones anteriores, las imágenes se pueden cargar normalmente, como se muestra en la siguiente figura: