问题描述:
在使用 JSP 实现文件上传功能时,有时会出现 java.io.IOException: Stream closed 异常,这是因为在使用表单上传文件时,文件流对象在上传完之后必须要关闭,若流被关闭后仍然继续写入文件流会发生流关闭异常。
解决方案:
- 将文件流转换为字节数组并缓存
在上传大型文件时,为了避免 OutOfMemoryError 异常,我们可以将文件流转换为字节数组并缓存起来,待所有数据读入完毕后再写入到磁盘。
示例代码:
InputStream is = filePart.getInputStream();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = -1;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.close();
is.close();
byte[] fileData = outputStream.toByteArray();
FileOutputStream fileOutputStream = new FileOutputStream(filePath);
fileOutputStream.write(fileData);
fileOutputStream.flush();
fileOutputStream.close();
上述代码中,我们使用 ByteArrayOuputStream 缓存文件字节数组,最后将其写入到磁盘。
- 将文件流转换为临时文件
在上传大型文件时,将文件流保存为临时文件也是一个不错的选择。在所有数据读入完毕后再将临时文件复制到目标文件中,这样可以有效避免 OutOfMemoryError 异常。
示例代码:
InputStream is = filePart.getInputStream();
File tempFile = File.createTempFile("uploadFile", ".tmp");
FileOutputStream outputStream = new FileOutputStream(tempFile);
int len = -1;
byte[] buffer = new byte[1024];
while ((len = is.read(buffer)) != -1) {
outputStream.write(buffer, 0, len);
}
outputStream.flush();
outputStream.close();
is.close();
FileUtils.copyFile(tempFile, new File(filePath));
tempFile.delete();
上述代码中,我们使用 File.createTempFile() 方法创建临时文件,将文件流写入临时文件并最终删除,然后使用 FileUtils.copyFile() 方法将临时文件复制到目标文件中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP上传图片产生 java.io.IOException: Stream closed异常解决方法 - Python技术站