利用FileUpload上传文件时,不管文件多大,都会溢出?

yksky 2007-06-13 05:43:19
利用apache的FileUpload组件上传文件的时候,刚开始的时候,还没有问题,一些小附件能上传,可是当测试了一个大附件之后,就报了内存溢出,再上传小附件,也上传不了,还是报内存溢出?为何?
以下是我处理的代码:

DiskFileUpload fileUpload = new DiskFileUpload();
//设置允许用户上传文件大小,单位:字节
fileUpload.setSizeMax(500*1024*1024);
//设置最多允许在内存中存储的数据,单位:字节
fileUpload.setSizeThreshold(100*1024*1024);
//设置一旦文件大小超过getSizeThreshold()的值时数据存放在硬盘的目录
//在进行文件上传的时候文件先存再内存中,然后才会存到server上,
// 但是如果内存放不下那么大的文件
//就必须用硬盘上的 一个临时文件夹来保存这个文件的部分,然后转存
//现在默认的文件存储的路径是
String tempPath = System.getProperty("user.dir");
tempPath = tempPath.replace('\\','/');
String temp = tempPath.substring(0, tempPath.length-3) +"webapps/BJRoadMIS/temp";
fileUpload.setRepositoryPath(temp);
//获取传入的表单中的参数值
try {
fileItems = fileUpload.parseRequest(request);
Iterator iterator = fileItems.iterator();
while(iterator.hasNext()){
FileItem fileItem = (FileItem)iterator.next();
if (fileItem.isFormField()){
value = value+segment+fileItem.getString();
}
};
try {
value = new String(value.getBytes("ISO-8859-1"),"gbk");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}

String[] s = value.split(segment);

if(s.length>1){
uploadPath = tempPath+"/webapps/BJRoadMIS/upload/";

try {
iterator = fileItems.iterator();
while(iterator.hasNext()) {
FileItem fileItem = (FileItem)iterator.next();
//文件域的表单信息
if (!fileItem.isFormField()) {
String strName = fileItem.getName();
uploadFileName = strName.substring(strName.lastIndexOf("\\")+1, strName.length());
long size = fileItem.getSize();
if((strName==null||strName.equals("")) && size==0)
continue;

pp=uploadFileName.substring(uploadFileName.lastIndexOf("."),uploadFileName.length());

File savedFile = new File(uploadPath +datelog+pp );
fileItem.write(savedFile);
request.setAttribute("msg","save file successful!");
}
}

if(request.getAttribute("msg")== null){
request.setAttribute("msg","save file failed!");
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
...全文
365 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
yaoyingwei 2008-03-11
  • 打赏
  • 举报
回复
是因为FileItem仍用着内存,在write()方法后掉用一下delete()方法,
最好是在finally里掉用。这样即使出现异常,也会清除当前FileItem对象占用的内容。

81,092

社区成员

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

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