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

yizhihongxing

问题描述:

在使用 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.prototype和vue.use的区别和注意点小结

    下面我将详细讲解一下“vue.prototype和vue.use的区别和注意点”。 1. vue.prototype的作用 vue.prototype是用来向vue实例注入自定义方法或者属性的。 通过Vue.prototype添加的属性和方法可以在每个Vue组件或者Vue实例中使用,而不需要在每个组件中进行重复的定义。 比如,我们要在每个Vue实例中都添加一…

    Vue 2023年5月27日
    00
  • vue Watch和Computed的使用总结

    我来为你详细讲解“vue Watch和Computed的使用总结”的完整攻略。 什么是vue Watch和Computed 在Vue.js开发中,数据的状态更新非常频繁,因此需要工具来监听并响应数据变化。Vue Watch和Computed都是解决Vue数据变化监听的两个方案。 Watch是一种对数据进行监听并做出相应的方案,当监听的数据发生变化时,会立即触…

    Vue 2023年5月27日
    00
  • Vue 组件(component)教程之实现精美的日历方法示例

    针对“Vue 组件(component)教程之实现精美的日历方法示例”,我可以介绍它的完整攻略,包括以下几部分内容: 理解 Vue 组件 在进入日历组件的实现前,首先需要理解什么是 Vue 组件。Vue 组件是 Vue.js 中的基本概念,它可以把一个页面拆分成若干独立、可重用的模块,并将这些模块进行拼装组合成为一个完整的页面。因此,理解 Vue 组件的分类…

    Vue 2023年5月28日
    00
  • 使用vuex的state状态对象的5种方式

    使用 Vuex 的 state 状态对象的 5 种方式如下: 1. 直接在组件中读取 Vuex 的 state 状态对象保存了应用中大部分的共享状态,组件可以直接从 state 中读取数据。例如,我们有一个保存用户名的 state,在组件中可以这样读取: <template> <div> {{ username }} </div…

    Vue 2023年5月28日
    00
  • vue实现指定日期之间的倒计时

    下面是关于”Vue 实现指定日期之间的倒计时”的完整攻略: 概述 倒计时是很常见的一项功能,用来实现类似于限时抢购、秒杀活动等功能。在 Vue 中实现倒计时可以使用 Vue 的计算属性或者 Watch 监听器来实现,同时还需要使用 JavaScript 中的 getTime 方法来获取时间戳以实现倒计时的功能。 步骤 下面是实现倒计时的一些步骤: 1.在 V…

    Vue 2023年5月28日
    00
  • Vue中添加滚动事件设置的方法详解

    下面详细讲解在Vue中添加滚动事件设置的方法。 1. 给元素绑定滚动事件 我们可以使用v-on指令来给元素绑定滚动事件。比如下面给一个div元素绑定滚动事件: <div v-on:scroll="handleScroll"></div> 上面的代码中,v-on:scroll表示给div元素绑定滚动事件,handle…

    Vue 2023年5月28日
    00
  • vue基于electron构建第一个程序

    下面详细讲解基于Vue和Electron构建第一个程序的攻略。 简介 Vue是一款流行的JavaScript框架,它可以用于构建单页面应用程序(SPA)和复杂的Web应用程序。Electron是由GitHub开发的跨平台桌面应用程序框架,可以使用JavaScript、HTML和CSS构建桌面应用程序。在Vue和Electron的结合中,我们可以构建出一个We…

    Vue 2023年5月27日
    00
  • Vue中使用setTimeout问题

    当在Vue组件中使用setTimeout函数时,需要注意以下几个问题: 1. setTimeout中的上下文 首先,需要注意的是setTimeout中的上下文(this指向)与Vue组件中的上下文不同。一般情况下,this指向的是window对象,而不是Vue组件实例。因此,在setTimeout函数中使用this可能会出现一些问题。 解决这个问题的方法是使…

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