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项目中使用AES实现密码加密解密(ECB和CBC两种模式)

    下面我就为你讲解在vue项目中使用AES实现密码加密解密的完整攻略。 简介 AES是一种对称加密算法,加密解密使用相同的密钥。在前后端交互中,经常需要对数据进行加密,以保证数据传输的安全性。本文将介绍如何在vue项目中使用AES实现密码加密解密。 安装依赖 在vue项目中使用AES需要安装crypto-js这个库,可以通过npm安装: npm install…

    Vue 2023年5月27日
    00
  • 手把手教你搭建一个vue项目的完整步骤

    下面是搭建Vue项目的完整步骤: 1. 创建Vue项目 创建Vue项目有多种方式,这里我们以 Vue CLI 为例。先确保已经安装了 Node.js,然后执行命令: npm install -g @vue/cli 安装成功后,使用 vue create 命令创建项目: vue create my-project 根据提示选择一些基本配置,然后等待安装完成即可…

    Vue 2023年5月28日
    00
  • Vue自动构建发布脚本的方法示例

    下面我详细讲解一下“Vue自动构建发布脚本的方法示例”的完整攻略。 1. 确定需求 在实现自动构建发布脚本之前,我们需要先确定具体的需求,以便确定脚本的功能和实现方案。一般来说,自动构建发布脚本的主要功能包括: 构建前的准备工作,如环境依赖检查、代码检查等; 代码的自动构建和打包; 代码的自动部署和发布。 2. 创建脚本 第二步是开始创建脚本。Vue自动构建…

    Vue 2023年5月27日
    00
  • 关于vue-tree-chart简单的使用

    关于vue-tree-chart简单的使用其实非常简单,一般包含以下几个步骤: 安装vue-tree-chart npm install vue-tree-chart –save 导入vue-tree-chart 在你需要使用vue-tree-chart的组件中,可以使用以下方式进行引入: “` “` 使用vue-tree-chart 在你需要使用vu…

    Vue 2023年5月29日
    00
  • vue多页面项目开发实战指南

    Vue多页面项目开发实战指南概述 Vue多页面项目是指一个网站由多个独立页面组成,每个页面可以使用不同的Vue组件和数据,但整个网站共享相同的运行环境和webpack配置。Vue多页面项目开发需要对webpack深入理解,同时要对Vue组件化和路由切换有一定的掌握。以下是Vue多页面项目开发的完整攻略: 创建Vue多页面项目基础结构 首先需要安装Vue和Vu…

    Vue 2023年5月28日
    00
  • vue.js在标签属性中插入变量参数的方法

    在Vue.js中,我们可以使用{{ }}来插入数据,这个特性被称为数据绑定。但在某些情况下,我们想要在标签属性中插入变量,该怎么做呢?下面是详细攻略和示例说明。 使用v-bind指令 在 Vue.js 中,我们可以使用指令 v-bind 来动态地绑定一个或多个属性,这也是在标签属性中插入变量的一种方式。 示例1:动态绑定class属性 <templat…

    Vue 2023年5月27日
    00
  • Vue中的vue-resource示例详解

    Vue中的vue-resource示例详解 什么是vue-resource vue-resource是一个Vue.js插件,用于通过XHR实用RESTful API。 安装和引用 安装: npm install vue-resource –save 引用: import VueResource from ‘vue-resource’ Vue.use(Vue…

    Vue 2023年5月28日
    00
  • Vue2 的 diff 算法规则原理详解

    Vue2 的 diff 算法规则原理详解 什么是 diff 算法? 在前端框架中,常常需要比较新旧虚拟 DOM 树来确定需要更新的节点,以此进行更新操作。而这个过程就被称之为 diff(差异)算法。 diff 算法通过比较两棵 DOM 树的差异,把更新的内容应用到真实 DOM 上,最终展示出最新的页面。这个过程其实也是整个前端框架的核心思想,而 Vue2 中…

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