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>
執行截圖:
控制檯: