当前位置: 首页 > 知识库问答 >
问题:

Spring Boot多部分/表单数据控制器方法

梁华清
2023-03-14

无论我怎么努力,似乎都无法解决这个问题。我正在提交此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;
}

我也在我的应用程序中手动粘贴了这些。属性,以确保其未被禁用:

multipart.enabled=true

Springhttp。多部分。启用=真

为了更好地衡量,以下是请求标头:

   * 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.请求对象,则有一个ArrayList of Application ationPart项目,其中包含一个DiskFileItem,似乎包含有关我尝试上传的文件的信息。这实际上是调用request.getParts()时返回的Collection。文件项位置路径是一些长tmp路径:

/private/var/folders/n8/15d6vbhj0692cslf3cx8c1jm0000gn/T/tomcat.6840182548028446450.8080/work/Tomcat/localhost/myapp

然而,它也表示内容类型是应用程序/八位字节流,大小是-1,还有一些奇怪的地方,比如“isFormField”是假的,尽管我在curl命令中将其指定为表单字段。因此,spring调用了正确的方法来处理多部分/表单数据请求,但“部分”信息似乎认为这是一个八位字节流。

共有1个答案

祁正阳
2023-03-14

我将分享使用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);
}

在本例中,我为概要文件用户上传了一张照片,并将其转换为字节数组。然后将其保存在数据库中。希望这对你有帮助

 类似资料:
  • 我正试图弄明白这一点。我的代码没有收到任何有用的错误消息,所以我使用了其他东西来生成一些东西。我在错误信息后附加了该代码。我已经找到了一个关于它的教程,但我不知道如何用我所拥有的实现它。这就是我目前拥有的: 错误: 对象{消息:“此资源不支持请求实体的媒体类型‘multipart/form data’。”,例外消息:“没有MediaTypeFormatter可用于读取媒体类型为“multipart

  • 我需要实现一个RESTendpoint,它接收我使用的多部分/表单数据: Spring防尘套 科特林 SpringMVC 提交包含以下部分的多部分表单: 部署名称------文本/普通 启用重复筛选------文本/普通 仅更改部署------文本/普通 部署源------文本/普通 租户id------文本/普通 *----应用程序/八位字节流 Rest控制器看起来是这样的: 对于所有有效的参数

  • 我正在向webapi控制器发送多部分数据。如何阅读方法中的内容?

  • 我在API控制器上开发C#(.NET5)方法时遇到困难,因为API控制器可以管理具有“多部分/表单数据”的请求;边界=边界' 我不能在客户端更改请求,我只能修改后端以适应它。 请求指定“内容类型:多部分/表单数据;boundary=boundary',它的主体内有一条json消息,我需要提取该消息。 在请求主体内,消息如下所示: 我可以使用以下代码: 然后,我可以使用IndexOf和Substri

  • 是否可以使用数据上传包含其他数据(如描述等)的文件?我正在使用骨干.js在我的前端,我用它调用REST API(jQuery)。我不使用任何视图解析器,但我想以某种方式将我的文件传递给控制器,如下所示: 以便uploadItem存储: 但是我不会(也不能)把这个加到我的模型里。 当然,我也很感兴趣是否有可能有这样的控制器:

  • 我正在尝试测试此控制器: 使用此模拟请求: 虽然,我猜我写MockMvcRequest错误,因为测试失败(返回的状态是500)。 提前感谢。