如何使用Spring / MultipartFile捕获中断的流

时间:2016-10-10 12:58:45

标签: java spring spring-boot

我有一个Spring Boot应用程序,它是移动/ Web应用程序的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>

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

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

计算并发送Multipart数据:

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

之后,您可以重新计算服务器端的checksum,以便检索要与请求验证范围内的收到的checksum进行比较的实际// Run button (start the search) final JButton btn = new JButton("Run"); btn.addActionListener(new ActionListener() { @SuppressWarnings("resource") public void actionPerformed(ActionEvent e) { try { String getTextArea; getTextArea = textArea.getText(); // converting the input to an array String[] arr = getTextArea.split("\\n"); // clearing the text textArea_1.setText(""); //line = arr.length; // looping for the input // doing something..... } // end of for loop } catch (Exception e2) { JOptionPane.showMessageDialog(null, "Search was not completed due to bad connection, please try pressing run again or close the tool and reopen it"); } } }); // Creating the progress bar JProgressBar progressBar = new JProgressBar(); progressBar.setStringPainted(true); progressBar.setValue(0); for(int z = 0; z <= line; z++) { progressBar.setValue(z); z = z + 1; progressBar.repaint(); } progressBar.setBounds(364, 11, 139, 22); contentPane.add(progressBar);