JSP文件上传

xiesisi3 2011-06-07 01:43:18
其实网上有太多太多这样的示例,但因为最近项目碰到一点小问题,然后搜了很久没有得到很好的解决,虽然后来自己解决掉了,但感觉中间过程中的有些东西还是值得大家共同学习学习。

不多说了,言归正传,让我们开始认识JSP上传。

首先,要弄清楚本地上传和服务器上传的区别,虽然基本上本地上传不会用到,但是我还是想把它列出来,好让童鞋们看清楚二者之间的分别。
本地上传
JSP中

<form method="post" action="fileupload.do">
<input type="file" name="file" id="file" value="path"/>
</form>

action中

private static final int BUFFER_SIZE = 300 * 1024;
private String path;
public String setPath(String path){this.path = path;}
private static void copy(File src, File dst) {
if(!dst.exists()) {
try {
dst.createNewFile();
} catch (IOException e1) {
e1.printStackTrace();
}
} else {
return;
}
try {
InputStream in = null ;
OutputStream out = null ;
try {
in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);
out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);
byte [] buffer = new byte [BUFFER_SIZE];
while (in.read(buffer) > 0 ) {
out.write(buffer);
}
} finally {
if ( null != in) {
}
if ( null != out) {
out.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public String upload(){
File loadFile = new File(path);
File saveFile = new File("你想存的路径");
copy(loadFile, saveFile);
}


这就完成了“本地上传”,本地上传的含义就是,你的服务器必须在本地,也就是和你上传时操作的是同一台电脑,这样才能上传成功。

话说本地上传有什么用?天知道,至少我觉得除非是在自己电脑上随便玩玩,不然是完全没有意义的。。。。。。

好了,现在开始服务器上传
利用struts2进行服务器上传的示例太多了,比如说这篇文章
http://blog.csdn.net/neusoftware_20063500/archive/2009/05/03/4144930.aspx
这种俗称通过"多媒体"的上传方式是很方便快捷的,但它隐藏了太多细节,比如说myFile是怎么被set进去的?这就是“封装”的得与失。

struts2提供的几个包里面,也有用来实现文件上传的包,通过这些包里面的一些方法,我们能略为知晓一些过程。
这种方法也有一个坏处,就是在Action中是无法使用的,只能通过jsp或者servlet来使用,为什么?看代码就知道了:

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

try {
if (!DiskFileUpload.isMultipartContent(request)) { //如果非含文件域的表单提交则return
return;
}

/*设置当文件大于102400字节的时候文件的临时目录*/
DefaultFileItemFactory factory = new DefaultFileItemFactory();
factory.setSizeThreshold(102400);
File fileTemp = new File("D:/file/");
fileTemp.mkdirs();
factory.setRepository(fileTemp);
DiskFileUpload upload = new DiskFileUpload(factory);
upload.setSizeMax(1024000);

List<FileItem> items = null;
try {
items = upload.parseRequest(request); //将request解析成FileItem对象的集合
} catch (SizeLimitExceededException e) {
request.setAttribute("message", "<script>alert('上传失败:您上传的文件太大!请重新选择')</script>");
System.out.print("上传文件太大");
return;
}
for (FileItem item : items) { //遍历集合
if (item.isFormField()) { //如果普通的域
String name = item.getFieldName();
String value = item.getString("GB18030");
System.out.println("name : " + name + "\tvalue : " + value);
} else {
String filename = item.getName();
System.out.println("filename : " + filename);
int i = filename.lastIndexOf("\\");
filename = filename.substring(i + 1);
System.out.println("filename : " + filename);

File f = new File("D:/file/" + filename);
item.write(f);
System.out.print("上传成功");
}
}
} catch (Exception e) {
e.printStackTrace();
}
request.getRequestDispatcher(request.getParameter("/manager/back/zizhi.jsp")).forward(request, response);
}

方法中的代码完全可以拷贝到jsp中去执行,效果是相同的。
为什么说只能在servlet和jsp中运行呢?在Action中运行会怎么样?请大家在csdn搜索 parseRequest 然后看答案
是的,N多的帖子都在问 为什么items是空的?为什么……
答案如果有详细看过回答的人会知道,因为struts2的拦截器把HttpServletRequest request拦截了,然后对它进行了一系列的处理,之后返回了一个“新”的request给我们,好吧,这个request里面压根儿就没有那些个劳什子FileItem对象
具体可以看官网的介绍
http://commons.apache.org/fileupload/faq.html
懒的人就看下面吧
Why is parseRequest() returning no items?
This most commonly happens when the request has already been parsed, or processed in some other way. Since the input stream has aleady been consumed by that earlier process, it is no longer available for parsing by Commons FileUpload.

那么要怎么解决?
很简单,其实它适应不了你,你就适应它就好了。
如果一定要在Action中写文件上传,那么就用struts2帮你封装好的一系列的东西吧,如果不是一定要在Action中写文件上传,那么用Servlet会比较好控制和使用,而且也容易实现批量上传。

看到这里,好吧,我承认我的目的是为了说明parseRequest的问题。只是留一个记录方便自己以后查询而已。

有什么问题可以发邮件到2177534@qq.com 注明是csdn上看到的。
...全文
232 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
傻傻的傻傻傻 2011-06-07
  • 打赏
  • 举报
回复
看看了。
wenbinglove 2011-06-07
  • 打赏
  • 举报
回复
不错 值得学习
24K純帥 2011-06-07
  • 打赏
  • 举报
回复
借我那把枪吧 2011-06-07
  • 打赏
  • 举报
回复
丝哥的分享一定要顶的

81,094

社区成员

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

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