Jsp 使用 fileupload 檔案上傳和下載
阿新 • • 發佈:2019-02-16
前言
Jsp檔案上傳的目前主要有兩個常用的:
1、SmartUpload
2、Apache Commons fileupload
我在期末的 Jsp 大作業需要一個檔案上傳下載模組,使用了第2個 Apache 的包,這裡我主要寫寫檔案上傳和下載的普通用法、注意的問題、最重要的是 表單的文字和檔案一塊提交的寫法。
檔案上傳
第一步、我們應該引入2個包:
commons-fileupload-1.2.1.jar
commons-io-1.4.jar
注:這兩個 jar 包配合使用,都需要引入,文末會附上下載連結。此外,這應該不是最新版,有強迫症的同學可以去 apache 看看。
第二步、放上 index.jsp 的表單:
//略過非重點...
<form method="post" action="/classhelp/UploadServlet"
enctype="multipart/form-data">
<input type="file" name="uploadFile" />
<input name="stuid" type="hidden" value="<%=studentid%>">
<input name="workid" type="hidden" value="<%=workid%>">
<input class="filesubmit" type="submit" value="上傳作業" />
</form>
我們可以看到:
form 的 method 是 post 的;
form 的內容格式要定義為 multipart/form-data 格式;
form 的 檔案input 的 type 是 file;
對,這三條是必須的!當然這裡表單還有stuid和workid。
第三步、UploadServlet 程式碼
@WebServlet ("/UploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private String filePath; // 檔案存放目錄
private String tempPath; // 臨時檔案目錄
private String studentid;
private String workid;
private String filename ;
private String SQLFileName;
// 初始化
public void init(ServletConfig config) throws ServletException {
super.init(config);
// 可以從配置檔案中獲得初始化引數
//filePath = config.getInitParameter("filepath");
//tempPath = config.getInitParameter("temppath");
//ServletContext context = getServletContext();
//filePath = context.getRealPath(filePath);
//tempPath = context.getRealPath(tempPath);
filePath="D:/ClassHelpFile/file";
tempPath="D:/ClassHelpFile/temp";
}
// doPost
public void doPost(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
//res.setContentType("text/plain;charset=gbk");
PrintWriter pw = res.getWriter();
try {
DiskFileItemFactory diskFactory = new DiskFileItemFactory();
// threshold 極限、臨界值,即硬碟快取 1M
diskFactory.setSizeThreshold(10 * 1024);
// repository 貯藏室,即臨時檔案目錄
diskFactory.setRepository(new File(tempPath));
ServletFileUpload upload = new ServletFileUpload(diskFactory);
//防止亂碼
upload.setHeaderEncoding("UTF-8");
// 設定允許上傳的最大檔案大小 4M
upload.setSizeMax(10 * 1024 * 1024);
// 解析HTTP請求訊息頭
List<FileItem> fileItems = upload.parseRequest(req);
Iterator<FileItem> iter = fileItems.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
processFormField(item, pw);//處理表單內容
} else {
processUploadFile(item, pw);//處理上傳的檔案
}
}
SQLFileName=tempPath+"/"+filename;
System.out.println(workid+" & "+studentid+" & "+SQLFileName);
//儲存到資料庫
String sql = "insert into finishwork(workid,studentid,fileurl) values('"+workid+"','"+studentid+"','"+SQLFileName+"')";
Connection conn = DBbean.getConn();
Statement stmt = DBbean.getStatement(conn);
DBbean.getResultSetOfInsert(stmt, sql);
DBbean.close(stmt);
DBbean.close(conn);
pw.close();
} catch (Exception e) {
System.out.println("異常:使用 fileupload 包發生異常!");
e.printStackTrace();
}
RequestDispatcher rd =req.getRequestDispatcher("/student/index_student.jsp?id="+studentid);
try{
rd.forward(req, res);
return;
}catch(Exception e){
System.out.print(e.toString());
}
return;
}
// 處理表單內容
private void processFormField(FileItem item, PrintWriter pw)
throws Exception {
String name = item.getFieldName();
if(name.equals("stuid")){
studentid = item.getString();
}else if(name.equals("workid")){
workid = item.getString();
}
}
// 處理上傳的檔案
private void processUploadFile(FileItem item, PrintWriter pw)
throws Exception {
filename = item.getName();
int index = filename.lastIndexOf("\\");
filename = filename.substring(index + 1, filename.length());
long fileSize = item.getSize();
if ("".equals(filename) && fileSize == 0) {
System.out.println("檔名為空 !");
return;
}
File uploadFile = new File(filePath + "/" + filename);
item.write(uploadFile);
//pw.println(filename + " 檔案儲存完畢 !");
//pw.println("檔案大小為 :" + fileSize + "\r\n");
}
// doGet
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws IOException, ServletException {
//doPost(req, res);
}
}
上述程式碼註釋很詳盡,其中,我們可以清楚的看到,處理表單普通內容的 processFormField 方法和處理上傳的檔案的 processUploadFile方法。特別注意 processFormField 方法,需要根據 form 表單的 name 來獲取內容。
這樣我們可以把表單的普通文字和檔案一塊提交啦!
檔案下載
表單就不放了,直接來 DownloadServlet:
/**
* 檔案下載
* @author GUOFENG
*
*/
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private String path;
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲取傳送的檔案路徑
path = request.getParameter("fileurl");
if (path != null) {
download(response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
public void download(HttpServletResponse response) throws IOException {
//去掉路徑,剩下檔名。
String realPath = path.substring(path.lastIndexOf("/") + 1);
// 告訴瀏覽器是以下載的方法獲取到資源,以此種編碼來解析。
response.setHeader("content-disposition", "attachment; filename="
+ URLEncoder.encode(realPath, "utf-8"));
// 獲取資源,儲存。
FileInputStream fis = new FileInputStream(path);
int len = 0;
byte[] buf = new byte[1024];
while ((len = fis.read(buf)) != -1) {
response.getOutputStream().write(buf, 0, len);
}
fis.close();
}
}
這裡傳入了檔案路徑,獲取檔案進行儲存。