Spring Boot + multipart / form-data控制器方法

时间:2016-08-01 22:56:51

标签: spring spring-boot multipart spring-restcontroller

无论我尝试什么,似乎无法解决这个问题。我提交了这个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"信息似乎认为它是一个八位字节流。

1 个答案:

答案 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);
}

在这种情况下,我为个人资料用户上传照片,并将其转换为字节数组。然后将其保存在数据库中。希望这能帮到你