【问题标题】:How to catch an interrupted stream with Spring/MultipartFile如何使用 Spring/MultipartFile 捕获中断的流
【发布时间】:2017-02-18 21:50:04
【问题描述】:

我有一个 Spring Boot 应用程序,它是移动/网络应用程序的 API。其中一个端点接受这样的 MultipartFile(图像或视频):

@RequestMapping(value = "/x/y/z", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<?> post(@RequestParam("file") MultipartFile file) {
...
}

调用该方法时,我会获取文件内容并将其保存在某处。但是,我注意到了一个错误 - 如果我在上传期间 终止移动应用程序上的网络连接,我在 API 端没有得到任何类型的 IOException,我最终得到截断的字节数组:

try {
 InputSteam inputStream = file.getInputStream();
 byte[] allBytes = IOUtils.toByteArray(inputStream);
 inputStream.close();
} catch (Exception ex) {
  //never get to this
}

所以问题是:如何确保流不中断?

使用 Spring Boot:

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.3.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

提前致谢。

【问题讨论】:

  • 可能这应该有助于stackoverflow.com/a/25867658/410677
  • @kuhajeyan 谢谢,你在这里特别指出什么?我已经有一个 MultipartFile 参考 - 大概它的大小仍会被截断? (我们不是分块上传)
  • 可能,不确定在执行操作之前检查文件内容/大小对您有多大帮助。
  • 多部分流已经加载到服务器,然后您才能在控制器中访问它。如果文件完整性对您很重要,请将其校验和与多部分本身一起发送。
  • @WildDev 谢谢。你能把它作为答案吗?

标签: java spring spring-boot


【解决方案1】:

Multipart 流已经加载到服务器,然后您才能在控制器中访问它。

使用checksum 确保文件不被中断。

计算它并与Multipart 数据一起发送:

@RequestMapping(...)
public ResponseEntity<?> post(@RequestParam("file") MultipartFile file,
                              @RequestParam("checksum") String checksum) {
    ...
}

之后,您可以在服务器端重新计算checksum,以检索实际的checksum,以便在请求验证范围内与接收到的checksum进行比较。

【讨论】:

    猜你喜欢
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    • 2010-09-16
    • 2013-06-09
    • 2012-12-14
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多