无论我尝试什么,似乎无法解决这个问题。我提交了这个curl命令:
curl -v -F name=countries.zip -F filedata=@countries.zip http://localhost:8080/rest
我有一个带有带注释的@RestController的Spring Boot 1.4应用程序,其中包含以下方法:
@RequestMapping(consumes = {"multipart/form-data"}, method = {RequestMethod.GET, RequestMethod.POST, RequestMethod.PUT, RequestMethod.DELETE}, path = {"/rest", "/rest/**"})
public void handleMultipartRestApiRequest(MultipartHttpServletRequest request, HttpServletResponse response, @RequestPart(value = "filedata", required = false) MultipartFile filedata) throws Exception {
r...
}
filedata变量始终为null,请求对象始终显示0个文件。
我尝试过使用MultipartResolver进行多项配置。这是我的最新消息:
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(5000000);
multipartResolver.setMaxInMemorySize(5000000);
multipartResolver.setDefaultEncoding("utf-8");
return multipartResolver;
}
我还手动将这些文件粘贴到我的application.properties中,只是为了确保它没有被禁用:
multipart.enabled=true
spring.http.multipart.enabled =真
并且为了更好地衡量,这里是请求标题:
* Connected to localhost (::1) port 8080 (#0)
> POST /rest HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.43.0
> Accept: */*
> Content-Length: 817999
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------7d3f4606455e862b
>
任何人都知道为什么我似乎无法在我的控制器上看到该文件?
更新1:
如果我深入挖掘请求对象并转到org.catalina.connector.Request对象,则会有一个ApplicationPart项的ArrayList,其中包含DiskFileItem,它似乎包含有关我尝试的文件的信息上传。这实际上是调用request.getParts()时返回的Collection。文件项位置路径是一些长tmp路径:
/private/var/folders/n8/15d6vbhj0692cslf3cx8c1jm0000gn/T/tomcat.6840182548028446450.8080/work/Tomcat/localhost/myapp
然而,它还说内容类型是application / octet-stream,大小为-1,还有一些其他的怪异,比如" isFormField"即使我在curl命令中将其指定为表单字段,也是假的。所以spring正在调用正确的方法来处理multipart / form-data请求,但是" part"信息似乎认为它是一个八位字节流。
答案 0 :(得分:-1)
我将分享我的功能,使用MultipartFile
上传文件,不需要解析器或bean,但是你只能单独发送文件,而不能使用其他类型的参数或正文。
@RequestMapping(value = "/updatePhoto", method = RequestMethod.POST)
public @ResponseBody
ResponseEntity<?> updateUsuario(@RequestParam("file") MultipartFile file,
OAuth2Authentication authentication) {
try {
User user = (User) authentication.getPrincipal();
Usuarios u = usuariosDAO.findUsuarioByUsername(user.getUsername());
if (file.getName().isEmpty() == false) {
InputStream inputStream = file.getInputStream();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] bytes = new byte[16384];
while ((nRead = inputStream.read(bytes, 0, bytes.length)) != -1) {
buffer.write(bytes, 0, nRead);
}
buffer.flush();
u.setImagen(buffer.toByteArray());
usuariosDAO.updateUsuario(u);
}
} catch (Exception e) {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
return new ResponseEntity<>(HttpStatus.OK);
}
在这种情况下,我为个人资料用户上传照片,并将其转换为字节数组。然后将其保存在数据库中。希望这能帮到你