ServletFileUpload类上传文件时的问题 Read failed with APR/native error code

jaffy 2019-12-10 08:18:01
一个WEB应用,上传文件进行处理。前端用的是bootstrap的fileinput方法,后端是JSP+Servlet
很奇怪的问题,在内部传输和大部分外部用户那里传输都没有问题
但在一个外部用户那里,传输某些文件(有些文件就是可以,有些就是不行,和文件大小无关),就会报这个错误。

[ERROR] 2019-12-05 12:59:12.724
org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Read failed with APR/native error code [730,054]

Caused by: java.io.IOException: Read failed with APR/native error code [730,054]

代码如下,
ServletFileUpload upload = new ServletFileUpload(factory);
logger.info("创建了ServletFileUpload对象");
upload.setHeaderEncoding("utf-8");


upload.setFileSizeMax(50 * 1024 * 1024);// 10M
logger.info("设置了最大的SIZE");// Parse the request
List<FileItem> items;


try {
logger.info("开始获取upload中的数据......");
items = upload.parseRequest(request);
logger.info("获取upload数据完毕");
|
...全文
578 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2019-12-10
  • 打赏
  • 举报
回复
确实很老的系统,估计NIO模式也不支持
windows的话 tomcat8 默认就是APR模式,也就是tomcat本身的jar包本身支持,但windows2003系统底层库可能不支持,你可以上tomcat官网查查看,要用APR模式windows需要打什么补丁
jaffy 2019-12-10
  • 打赏
  • 举报
回复
tomcat版本是8.0.36
jaffy 2019-12-10
  • 打赏
  • 举报
回复 1
Server.xml改成 如下没有生效。不知道是什么问题
操作系统是Win2003 很老的系统了,上面很多其他服务,也无法升级。

<Connector
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"

  • 举报
回复
@jaffy 问下您最后怎么解决的
qybao 2019-12-10
  • 打赏
  • 举报
回复
看着像IO模式的问题,昨天刚好回答一个类似的问题
你现在的tomcat是以APR的模式运行的(需要操作系统支持),你改成NIO模式试试
可以参考以下帖子
https://bbs.csdn.net/topics/395290923
第1个上传组件commons-fileupload =============commons-fileupload ================ common-fileupload组件是apache的一个开源项目之一,可以从http://jakarta.apache.org/commons/fileupload/下载。该组件简单易用,可实现一次上传一个或多个文件,并可限制文件大小。 -下载后解压zip包,将commons-fileupload-1.1.1.jar,和commons-io-1.2.jar(这里我们用的是更新的版本,但是用法是一样的)复制到tomcat的webapps\你的webapp\WEB-INF\lib\下,如果目录不存在请自建目录。 新建一个servlet: FileUpload.java用于文件上传: package com.drp.util.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.*; import java.util.*; import java.util.regex.*; import java.io.*; import org.apache.commons.fileupload.servlet.*; import org.apache.commons.fileupload.disk.DiskFileItemFactory; public class FileUpload extends HttpServlet { private String uploadPath = ""; // 用于存放上传文件的目录 private File tempPath = new File("D:\\Tomcat 5.5\\webapps\\drp1.2\\tempimages\\"); // 用于存放临文件的目录 public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/html; charset=GB18030"); PrintWriter out = res.getWriter(); System.out.println(req.getContentLength()); System.out.println(req.getContentType()); DiskFileItemFactory factory = new DiskFileItemFactory(); // maximum size that will be stored in memory //允许设置内存中存储数据的门限,单位:字节 factory.setSizeThreshold(4096); // the location for saving data that is larger than getSizeThreshold() //如果文件大小大于SizeThreshold,则保存到临目录 factory.setRepository(new File("D:\\Tomcat 5.5\\webapps\\drp1.2\\tempimages")); ServletFileUpload upload = new ServletFileUpload(factory); // maximum size before a FileUploadException will be thrown //最大上传文件,单位:字节 upload.setSizeMax(1000000); try { List fileItems = upload.parseRequest(req); // assume we know there are two files. The first file is a small //

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧