1. 程式人生 > >servlet+jsp實現多檔案上傳到webroot下upload資料夾

servlet+jsp實現多檔案上傳到webroot下upload資料夾

因為最近做的一個專案需要用到檔案上傳功能,所以就上網查, 但大多數都是程式碼不全,最後綜合了一下。同時添加了獲取當前時間,新建檔案(如果upload資料夾不存在則新建, path+date)並儲存進去。並且API檔案上傳處理,以流的形式獲取當前值,(前面我已獲得一個值輸出 name="flat" value="!!")

下面附上我的這個功能程式碼以及截圖,這個過程用到了2個有關jar包:commons-fileupload-1.2.2.jar,commons-io-1.3.2.jar。有需要的留言,目前上傳資源還在稽核。

下載這邊個jar包,然後直接拷貝以下程式碼即可

程式碼:

jsp頁面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>上傳頁面</title>

</head> 
<body> 
<!--多檔案上傳,enctype="multipart/form-data"--> 
<form action="UploadServlet.do" method="post" enctype="multipart/form-data">
歡迎平板號:<input type="text" name="flat" value="<%=request.getAttribute("flat_id") %>" readonly="readonly">使用者上傳截圖<p></p>
<!-- multiple="multiple"  多條選擇-->

截圖:  <input type="file" name="fileName" id="name1" multiple="multiple"/>
<p></p>
<!-- 未成交截圖:<input type="file" name="fileName" id="name2" multiple="multiple" />
<p></p> -->
<input type="submit" value="上傳"/> 
</form> 
</body> 
</html> 

UploadServlet.java:


import java.io.*; 
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 UploadServlet extends HttpServlet { 
private static final long serialVersionUID = 1L;


public void doPost(HttpServletRequest request, HttpServletResponse response) 
  throws ServletException, IOException {  
 request.setCharacterEncoding("utf-8"); //設定編碼 
 //獲得磁碟檔案條目工廠 
 DiskFileItemFactory factory = new DiskFileItemFactory(); 
 //獲取檔案需要上傳到的路徑 
 String path = request.getRealPath("/upload"); //上傳路徑
 factory.setRepository(new File(path)); 
 //設定 快取的大小,當上傳檔案的容量超過該快取時,直接放到 暫時儲存室 ,減少佔用記憶體,    實際上傳兩份.tem格式 可不同目錄 
 factory.setSizeThreshold(1024*1024) ; 
   
 ServletFileUpload upload = new ServletFileUpload(factory);  //高水平的API檔案上傳處理 
 try { 
  //可以上傳多個檔案 
  List<FileItem> list = (List<FileItem>)upload.parseRequest(request); 
  for(FileItem item : list) 
  { 
  String name = item.getFieldName(); //獲取表單的屬性名字  
//獲取使用者具體輸入的字串 ,名字起得挺好,因為表單提交過來的是 字串型別的 
   
  //如果獲取的表單資訊是普通的文字資訊
  if(item.isFormField()) 
  {
   String value = item.getString() ;
   request.setAttribute(name, value); 
   System.err.println(value);
  } 
  // file型別
  else
  { 
   //獲取路徑名 
   String value = item.getName() ; 
   //索引到最後一個反斜槓 
   int start = value.lastIndexOf("\\"); 
   //擷取 上傳檔案的 字串名字,加1是 去掉反斜槓, 
   String filename = value.substring(start+1); //獲得檔名
   request.setAttribute(name, filename); 
   
   /*
         *獲取當前時間*/
        java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat(  
     "yyyy-MM-dd");
        java.util.Date currentTime = new java.util.Date(); 
        String date = simpleDateFormat.format(currentTime).toString();
   
        /*建立資料夾*/
        String fn = path+"\\"+date;  //path+"\\"+id+"\\"+date
        File fileDir = new File(fn);    
        if (!fileDir.exists()) { //如果不存在 則建立     
            fileDir.mkdirs();    
        }   
   System.out.println("路徑與檔名:"+fn+"\\"+filename);
   
   //寫到磁碟上 丟擲的異常 用exception 捕捉 
   //File file = new File(fn+"\\"+filename); 
   OutputStream out = new FileOutputStream(new File(fn,filename)); 
   InputStream in = item.getInputStream() ; 
   int length = 0 ; 
   byte [] buf = new byte[1024] ; 
   // in.read(buf) 每次讀到的資料存放在 buf 陣列中    
   while( (length = in.read(buf) ) != -1) 
   { 
   //在 buf 陣列中 取出資料 寫到 (輸出流)磁碟上 
   out.write(buf, 0, length); 
   } 
   in.close(); 
   out.close(); 
  } 
  } 
 }catch (FileUploadException e) { 
  e.printStackTrace(); 
 } 
 catch (Exception e) { 
  //e.printStackTrace(); 
 } 
 System.err.println();
 //轉發
 request.getRequestDispatcher("success.jsp").forward(request, response); 
 } 
}

web.xml

   <servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>UploadServlet</servlet-class>

  </servlet>

 <servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/UploadServlet.do</url-pattern>
  </servlet-mapping>

執行截圖:



控制檯: