JSP上传图片产生 java.io.IOException: Stream closed异常解决方法

问题描述:

在使用 JSP 实现文件上传功能时,有时会出现 java.io.IOException: Stream closed 异常,这是因为在使用表单上传文件时,文件流对象在上传完之后必须要关闭,若流被关闭后仍然继续写入文件流会发生流关闭异常。

解决方案:

  1. 将文件流转换为字节数组并缓存

在上传大型文件时,为了避免 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 缓存文件字节数组,最后将其写入到磁盘。

  1. 将文件流转换为临时文件

在上传大型文件时,将文件流保存为临时文件也是一个不错的选择。在所有数据读入完毕后再将临时文件复制到目标文件中,这样可以有效避免 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技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • 一步一步实现Vue的响应式(对象观测)

    实现Vue的响应式(对象观测) 什么是Vue的响应式? Vue的响应式是指当Vue数据模型中的数据发生变化时,页面中涉及这些数据的部分会自动重新渲染并更新。Vue通过数据劫持方式实现响应式,也就是通过监听对象属性的变化来实现自动触发视图更新。 如何实现Vue的响应式? Vue的响应式是基于Object.defineProperty()方法实现。该方法能够监听…

    Vue 2023年5月27日
    00
  • Vue项目打包部署全过程(history模式)

    下面是Vue项目打包部署全过程(history模式)的完整攻略。 1. 打包项目 使用Vue CLI的build命令来打包项目,在项目根目录下的终端输入以下命令: npm run build 这将把项目打包到dist目录中。打包完后,dist目录下会生成一个index.html文件和一些资源文件。 2. 配置服务器 使用Express框架来搭建服务器,先安装…

    Vue 2023年5月28日
    00
  • Vue编译器AST抽象语法树源码分析

    一、概述 Vue是一个流行的JavaScript框架,通过它可以方便地构建可伸缩的单页面应用程序,能够帮助我们快速构建高效且易于维护的Web应用系统。在Vue中,模板被转换成一个抽象语法树(AST),这个AST是通过Vue编译器(parser)将模板代码转换而来的。AST通过获取DOM节点,识别出语言特定的标记和元素,自动创建了一个基于对象表示代码的结构树。…

    Vue 2023年5月27日
    00
  • vue下载excel文件的四种方法实例

    下面是“vue下载excel文件的四种方法实例”的完整攻略: 1. 基于前端导出Excel库的实现 使用前端导出Excel库(如FileSaver.js),将数据导出为.xlsx或.csv格式的文件,使其能够被浏览器下载。 import { saveAs } from ‘file-saver’; //导入FileSaver.js库 export functi…

    Vue 2023年5月28日
    00
  • 详解vue.js根据不同环境(正式、测试)打包到不同目录

    要根据不同环境(正式、测试)打包到不同目录,我们可以使用webpack进行配置。 首先,在项目根目录下创建一个config文件夹,里面创建三个文件:dev.env.js、prod.env.js、index.js。 dev.env.js文件内容如下: module.exports = { NODE_ENV: ‘"development"’,…

    Vue 2023年5月28日
    00
  • vue如何使用el-table遍历循环表头和表体数据

    当我们需要在Vue项目中显示表格数据时,我们可以使用 Element UI 提供的 el-table 组件。在使用 el-table 组件时,经常会遇到需要遍历循环表头和表体数据的情况。下面是详细的步骤: 1. 安装 Element UI 首先,我们需要安装 Element UI。打开终端并运行以下命令: npm install element-ui –s…

    Vue 2023年5月28日
    00
  • 详解如何制作并发布一个vue的组件的npm包

    制作并发布一个 Vue 的组件 npm 包,流程大致如下: 初始化项目并创建组件 编写组件原型并打包 发布 npm 包 下面将详细解释这些步骤。 初始化项目并创建组件 将组件发布到 npm 前,首先需要初始化本地项目,并创建一个 Vue 组件。我们可以使用 Vue CLI 工具来初始化项目,具体步骤如下: 安装 Vue CLI:npm install -g …

    Vue 2023年5月28日
    00
  • VUE-ElementUI 时间区间选择器的使用

    针对“VUE-ElementUI 时间区间选择器的使用”的完整攻略,我可以提供以下内容: VUE-ElementUI 时间区间选择器的使用 介绍 VUE-ElementUI是基于Vue.js 2.0的桌面端组件库,它提供了丰富的页面组件和交互,其中包括时间区间选择器。 安装 在使用时间区间选择器之前,我们首先需要在项目中引入ElementUI组件库。可以使用…

    Vue 2023年5月29日
    00
合作推广
合作推广
分享本页
返回顶部