使用commons组件上传文件

需要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.pluginsorg.eclipse.wst.server.coretmpwtpwebappsFileUploadupload
  
   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.pluginsorg.eclipse.wst.server.coretmp0wtpwebappsFileUploadupload 可以看到上传成功了,但是找到项目的路径D:workspaceFileUploadWebContentupload是没有的,所以在项目里怎么刷新也看不到。老师说是一个是开发路径,一个是实际路径。直接用,是可以得到的,只是在项目里看不到。我看的视频,那个风中叶老师的struts2视频的第13讲,可以看到,可能是MyEclipse的视图和Eclipse的视频不一样吧。但是确实可以引用到。像success.jsp就拿到了。效果图我没传。嘿嘿

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

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

   <init-param>
   <param-name>path</param-name>
   <param-value>D:workspaceFileUploadWebContentupload</param-value>
   </init-param>
  
</servlet>

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

注释掉

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

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

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

D:workspace.metadata.pluginsorg.eclipse.wst.server.coretmpwtpwebappsFileUploadupload 下有没有呢?去看看,结果发现对应的也有。

这就充分说明,D:workspace.metadata.pluginsorg.eclipse.wst.server.coretmpwtpwebappsFileUploadupload

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

好玩吧。。。。.

8月26日续:

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

此条目发表在 Java Web 分类目录,贴了 , , 标签。将固定链接加入收藏夹。

使用commons组件上传文件》有 4 条评论

  1. tangjingqi1 说:

    109503292 我的QQ 希望可以加下 强烈希望大哥教教我这个上传问题

  2. zxsz4085 说:

    回复tangjingqi1:

  3. tashijinhou 说:

    我的QQ:270379763,需要向您一下谢谢您了(*^__^*) 嘻嘻……刚开始工作,公司里我一个人做技术,帮帮忙,上传有个地方不懂O(∩_∩)O~

  4. zxsz4085 说:

    回复tashijinhou:

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>