使用commons組件上傳文件

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循環外面得以修正!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章