java:檔案上傳與下載
阿新 • • 發佈:2018-11-09
一.檔案上傳
1.注意:
-
jsp提交方式必須為post
-
必須採用複雜格式 : enctype=“multipart/form-data”
<form action="/upload" method="post" enctype="multipart/form-data">
-
需要commons-fileupload.jar來解析multipart/form-data格式,並且要依賴commons-io.jar
2.程式碼如下:
update.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="/upload" method="post" enctype="multipart/form-data"> <p> 姓名<input type="text" name="name"></p> <p><input type="file" name="img"> ${requestScope.error}</p> <p><input type="submit" value="提交"></p> </form> </body> </html>
UpdateServlet:
@WebServlet(urlPatterns = "/upload") public class UploadServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //提前建立儲存圖片的目錄 new File("e:\\images").mkdirs(); //將上傳的檔案存入伺服器磁碟的一個工具類 DiskFileItemFactory factory = new DiskFileItemFactory(); //核心檔案上傳工具類 ServletFileUpload fileUpload = new ServletFileUpload(factory); fileUpload.setSizeMax(1024*1024); try { //list對應表單的資料集合,其中每一項抽象為了FileItem(文字框,檔案,複選框...) List<FileItem> list = fileUpload.parseRequest(req); //遍歷集合 for (FileItem item : list) { //如果是普通表單選項 if(item.isFormField()){ System.out.println("引數名:"+item.getFieldName()); System.out.println("值:"+item.getString("UTF-8")); }else { //否則不是一個普通表單項,是一個檔案 System.out.println("得到檔案長度:"+item.getSize()); if(item.getSize()>0){ System.out.println("檔案的原始名:"+item.getName()); item.write(new File("e:\\images\\"+item.getName())); } } System.out.println("==============================="); } } catch (FileUploadBase.SizeLimitExceededException e) { req.setAttribute("error", "上傳的檔案超過了大小限制"); req.getRequestDispatcher("/upload.jsp").forward(req, resp); } catch (FileUploadException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }
二.檔案下載
1.DownloadServlet程式碼:
@WebServlet(urlPatterns = "/download/*") public class DownloadServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 1) 當響應的 content-type 設定為image,瀏覽器會顯示圖片 resp.setContentType("image/jpg"); // 2) 如果要把圖片進行下載操作 resp.setContentType("application/octet-stream");//二進位制流,當不知道下載檔案的型別是用 //讓瀏覽器預設下載而非展現這張圖,並且以1.jpg的名字儲存。 resp.addHeader("content-disposition","attachment;filename=new.jpg"); // 把【瀏覽器的路徑】 轉換為 【伺服器的磁碟路徑】 String uri = req.getRequestURI(); // 獲取瀏覽器實際輸入路徑 System.out.println(uri); String path = "E:\\" + uri;// 圖片的磁碟路徑 // 如果檔案不存在,返回404 if( !new File(path).exists() ) { resp.sendError(404); return; } // 如果存在,從檔案輸入流讀取,向響應的輸出流寫 FileInputStream is = new FileInputStream(path); OutputStream os = resp.getOutputStream(); IOUtils.copy(is, os); IOUtils.closeQuietly(is); } }
2.注意:上述程式碼中有如下一段程式碼
// 2) 如果要把圖片進行下載操作
resp.setContentType("application/octet-stream");//二進位制流,當不知道下載檔案的型別是用
//讓瀏覽器預設下載而非展現這張圖,並且以1.jpg的名字儲存。
resp.addHeader("content-disposition","attachment;filename=new.jpg");
二進流不知道檔案型別時用application/octet-stream如下圖: