文件上传问题(commons-fileupload)

Sleeping0804 2009-12-24 11:51:00
提交页面:
<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<html>
<head>
<title>Index</title>
</head>
<body>
<form action="comm" method="post" enctype="multipart/form-data">
<input type="file" name="f1"/><br />
<input type="file" name="f2"/><br />
<input type="file" name="f3"/><br />
<input type="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>

</body>
</html>



处理请求的servlet:
package myFamily;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class Commons extends HttpServlet {

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter pw=resp.getWriter();

FileItemFactory fact;
DiskFileItemFactory dfact=new DiskFileItemFactory();

ServletFileUpload upload=new ServletFileUpload(dfact);
List ll;
FileItem fi;

dfact.setSizeThreshold(1024*100); //100kb
dfact.setRepository(new File("f:/buffer")); //缓冲目录
try {
upload.setSizeMax(1024*1024*70); //70MB
ll=upload.parseRequest(req);
for(int i=0; i<ll.size(); i++){ //表单输入域都是file,所以没有加判断
fi=(FileItem)ll.get(i);
fi.write(new File("f:/temp",fi.getName()));
}

} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}


两个问题:
1.我设置的最大尺寸是70mb,上传一个45mb的文件到f:/temp (该目录的确存在)
每次都抛:
java.io.FileNotFoundException: f:\temp (拒绝访问。)
但文件保存已经保存成功了。
为什么抛这种异常呢?
2.setSizeMax()方法设置的是单个文件的大小,还是所有文件的总大小?
...全文
177 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sleeping0804 2009-12-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nickycheng 的回复:]
哦,sorry,看错。第一个问题搞不清楚为什么会抛错。把错误堆栈贴出来看看
[/Quote]

如下:
java.io.FileNotFoundException: f:\temp (拒绝访问。)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:179)
at java.io.FileOutputStream.<init>(FileOutputStream.java:131)
at org.apache.commons.fileupload.disk.DiskFileItem.write(DiskFileItem.java:390)
at myFamily.Commons.doPost(Commons.java:39)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)


虽报错,但文件已正常保存在f:/temp中了
nickycheng 2009-12-24
  • 打赏
  • 举报
回复
哦,sorry,看错。第一个问题搞不清楚为什么会抛错。把错误堆栈贴出来看看
nickycheng 2009-12-24
  • 打赏
  • 举报
回复
fi.write(new File("f:/temp",fi.getName()));
这是写文件到 f:/temp (这是个没有后缀名的文件)
你已经存在f:/temp这个目录,所以报错。

应该
fi.write(new File("f:/temp/xxx.xx",fi.getName()));



setFileSizeMax
public void setFileSizeMax(long fileSizeMax)Sets the maximum allowed size of a single uploaded file, as opposed to getSizeMax().

Parameters:
fileSizeMax - Maximum size of a single uploaded file.
See Also:
getFileSizeMax()

Sleeping0804 2009-12-24
  • 打赏
  • 举报
回复
顶一下....
zhao_tk 2009-12-24
  • 打赏
  • 举报
回复
1、文件名没写对

2、路径错误,包括路径不存在,路径字符串书写有问题!

3、文件夹权限设置不允许访问
zhao_tk 2009-12-24
  • 打赏
  • 举报
回复
f:\temp 改成 f:\\temp 试试
sxl12396 2009-12-24
  • 打赏
  • 举报
回复
没遇到过,呵呵···
Sleeping0804 2009-12-24
  • 打赏
  • 举报
回复
再顶,
有人碰到过类似问题吗?
nickycheng 2009-12-24
  • 打赏
  • 举报
回复
没什么道理,你多试试吧。

1.尝试改下,并打印file的full path
fi.write(new File("f:/temp/" + fi.getName));

2. 换个目录试试

3. 看看目录的访问权限属性

23,404

社区成员

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

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