现在的位置: 首页 > 综合 > 正文

使用commons组件上传文件

2013年09月20日 ⁄ 综合 ⁄ 共 5568字 ⁄ 字号 评论关闭
2009-08-14 14:35

需要commons-upload 和commons-io 这2个jar包。

提交页面 test.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<form action="FileUpload" enctype="multipart/form-data" method="post">
     <input type="text" name="username" /><br />
    
     <input type="file" name="myfile1" /><br/>
     <input type="file" name="myfile2" /><br/>
     <input type="submit" value="submit" />
    </form>

</body>
</html>

FileUpload.java内容:

package com.cstp.upload;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
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.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUpload extends HttpServlet {

private static final long serialVersionUID = 5537949684189178272L;

public FileUpload() {
   super();
}

public void destroy() {
   super.destroy();
}

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

   doPost(request, response);
}

@SuppressWarnings("unchecked")
public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
   request.setCharacterEncoding("utf-8");
   response.setCharacterEncoding("utf-8");
   response.setContentType("text/html");

   DiskFileItemFactory factory = new DiskFileItemFactory();

   // 设置文件的缓存路径
   // String path=request.getRealPath("/upload"); 方法已过时,值和第3个path一样
   // String path=request.getServletPath();     /FileUpload
   String path = request.getSession().getServletContext().getRealPath(
     "/upload");

//D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp/wtpwebapps/FileUpload/upload
  
   factory.setRepository(new File(path));
   factory.setSizeThreshold(1024 * 1024);
   ServletFileUpload upload = new ServletFileUpload(factory);
   // 设置上传文件大小的上限,-1表示无上限

   upload.setSizeMax(-1);
   List<FileItem> list = null;
   try {
    // 上传文件,并解析出所有的表单字段,包括普通字段和文件字段

    list = upload.parseRequest(request);
   
   } catch (FileUploadException ex) {
    System.out.println("上传发生异常" + ex.getMessage());
   }

   // 下面对每个字段进行处理,分普通字段和文件字段

List<String> photoList=new ArrayList();

   for (FileItem fileItem : list) {

    // 如果是普通字段
    if (fileItem.isFormField()) {

     System.out.println("文本框的name属性:" + fileItem.getFieldName()
       + "/n文件名:" + fileItem.getName());// 不是文件,所以得不到文件名
    } else {
     String fieldName = fileItem.getFieldName();
     String fileName = fileItem.getName();

     int start = fileName.lastIndexOf("//");
     fileName = fileName.substring(start + 1);
     System.out.println("文本框的name属性:" + fieldName + "/n文件名:"
       + fileName + "/n文件类型:" + fileItem.getContentType()
       + "/n文件大小:" + fileItem.getSize());
    
     //因为2个框,想都在成功页面显示,所以用集合装上他们的名字
     photoList.add(fileName);
     
       // if (fileItem.getName() != null && fileItem.getSize() != 0) {
     // OutputStream os= new FileOutputStream(new
     // File(path,fileName));
     //      
     // InputStream is=fileItem.getInputStream();
     // byte[] b=new byte[400];
     // int length=0;
     // while((length=is.read())>0){
     //       
     //       
     // os.write(b,0,length-1);
     // os.close();
     // is.close();

     // }
     try {
      fileItem.write(new File(path, fileName));//也可以用上述方式写到目的地
     } catch (Exception e) {

      e.printStackTrace();
     }
    }

   }

request.getSession().setAttribute("photo", photoList);
   request.getRequestDispatcher("./success.jsp")
     .forward(request, response);
}

public void init() throws ServletException {
  
}

}

success.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="
http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
图片上传成功!!!
<table>
<c:forEach var="xx" items="${photo}">
   <tr>
    <td><img alt="" src="./upload/${xx}"></td>
   </tr>
</c:forEach>
</table>
</body>
</html>

需要注意的问题是:上传后 webroot下的upload文件夹里看不到,但是去上传的绝对路径也就是程序中的path:D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/FileUpload/upload 可以看到上传成功了,但是找到项目的路径D:/workspace/FileUpload/WebContent/upload是没有的,所以在项目里怎么刷新也看不到。老师说是一个是开发路径,一个是实际路径。直接用,是可以得到的,只是在项目里看不到。我看的视频,那个风中叶老师的struts2视频的第13讲,可以看到,可能是MyEclipse的视图和Eclipse的视频不一样吧。但是确实可以引用到。像success.jsp就拿到了。效果图我没传。嘿嘿

如果想在D:/workspace/FileUpload/WebContent/upload看到,在web.xml文件里的servlet节点里servlet-class后配置里加上参数表示D:/workspace/FileUpload/WebContent/upload ,原因就是内部认识虚拟路径,是吧!

<servlet>
  
   <servlet-name>FileUpload</servlet-name>
   <servlet-class>com.cstp.upload.FileUpload</servlet-class>

   <init-param>
   <param-name>path</param-name>
   <param-value>D:/workspace/FileUpload/WebContent/upload</param-value>
   </init-param>
  
</servlet>

到时,在servlet里的path读到这里配置的值就可以了。

注释掉

String path = request.getSession().getServletContext().getRealPath(
     "/upload");

String path=super.getInitParameter("path");

再来一次成功后刷新项目,就会看到上传的文件啦,

D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp/wtpwebapps/FileUpload/upload 下有没有呢?去看看,结果发现对应的也有。

这就充分说明,D:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp/wtpwebapps/FileUpload/upload

D:/workspace/FileUpload/WebContent/upload 是对应的。上面的方式其实也说明了,只是项目里看不到,但直接引用那块的文件,比如一个图片,确实可以显示。

好玩吧。。。。.

8月26日续:

session放的地方不对导致出了点小问题,只显示一个图片。现已通过把session把到for循环外面得以修正!

抱歉!评论已关闭.