通過Servlet實現檔案的上傳和下載
阿新 • • 發佈:2018-11-08
一、要實現Servlet的檔案上傳和下載,首先需要藉助第三方的jar包
二、Servlet的程式碼
package com.xh.web; 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; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; @WebServlet(name = "DownloadServlet",urlPatterns = {"/download","/upload"}) public class DownloadServlet extends HttpServlet { /** * 檔案上傳 * @param request * @param response * @throws ServletException * @throws IOException */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //宣告工廠 DiskFileItemFactory factory = new DiskFileItemFactory(); //宣告上傳元件 ServletFileUpload upload = new ServletFileUpload(factory); //指定字符集 upload.setHeaderEncoding("UTF-8"); //獲取專案的絕對路勁(根路徑) String realPath = this.getServletContext().getRealPath("./"); //File.separator 路徑分隔符,不同系統的分隔符不同 //建立檔案上傳的資料夾“file”,如果檔案不存在就建立 File file = new File(realPath+File.separator+"file"); if(!file.isDirectory()){ file.mkdirs(); } try { //獲取所有的表單類容 List<FileItem> items =upload.parseRequest(request); for (FileItem f : items) { //判斷是否是一個輸入元素,false 為檔案,true 不是檔案 if(!f.isFormField()){ //獲取檔名 String fileName = f.getName(); //獲取檔案字尾 String suffix = fileName.substring(fileName.indexOf(".")); //獲取當前時間 Date date = new Date(); //格式化當前時間 SimpleDateFormat format = new SimpleDateFormat("YYMMddHHmmss"); //重新命名檔名,防止重複,因為時間也有可能重複,可加入UUID等隨機資料,最大程度防止檔名重複 String newName = format.format(date)+suffix; // UUID.randomUUID() //獲取檔案類容 byte[] bytes = f.get(); //建立輸出流,輸出檔案 FileOutputStream outputStream = new FileOutputStream(file+File.separator+newName); outputStream.write(bytes); outputStream.close(); } } } catch (FileUploadException e) { e.printStackTrace(); } } /** * 檔案下載 * @param request * @param response * @throws ServletException * @throws IOException */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //從前端獲取要下載的檔名 String fileName = request.getParameter("filename"); //獲取專案的絕對路徑 String realPath = this.getServletContext().getRealPath("./"); //獲得下載檔案的路徑,該路徑為之前上傳的檔案 File file = new File(realPath+File.separator+"file"); //拼接檔案路徑 String fileString = file+File.separator+fileName; //設定字元編碼 response.setCharacterEncoding("UTF-8"); //String fileName_encode = URLEncoder.encode(fileName,"UTF-8"); //防止中文亂碼 //防止中文亂碼,符號亂碼等問題 String fileName_encode= new String(fileName.getBytes(),"ISO8859-1"); //設定響應頭(重要) response.setHeader("Content-Disposition","attachment; filename="+fileName_encode); //建立輸出流 FileInputStream fileInputStream = new FileInputStream(fileString); //建立輸出流1 (可用) /* byte[] bytes = new byte[2048]; ServletOutputStream outputStream = response.getOutputStream(); int i = 0; while(( i = fileInputStream.read(bytes))!=-1){ outputStream.write(bytes,0,i); outputStream.flush(); } outputStream.close(); */ //建立輸出流2 //獲取檔案輸出流大小 int size = fileInputStream.available(); byte[] bytes = new byte[size]; fileInputStream.read(bytes); ServletOutputStream outputStream = response.getOutputStream(); outputStream.write(bytes); outputStream.close(); } }
三、HTML程式碼
注意:下載介面的filename為自己上傳的(處理後)的檔名,超連結的href路徑或form表單的路徑根據自己的專案設定
1、檔案上傳的HTML程式碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="../upload" method="post" enctype="multipart/form-data"> <input type="file" name="myfile"> <input type="submit"> </form> </body> </html>
2、檔案下載的HTML程式碼
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <a href="../download?filename=jianli.jpg">jianli.jpg</a> <a href="../download?filename=Java.docx">Java.docx</a> <a href="../download?filename=個人簡歷.doc">個人簡歷.doc</a> <img src="../file/jianli.jpg"> <!-- 測試上傳圖片能否正常顯示(相對路徑)--> </body> </html>