javaWeb文件上傳與下載


文件上傳與下載在項目中運用的使用頻率很大 今天也花時間整理了一下 多文件上傳圖片回顯 和文件下載

 1.多文件上傳

這里會涉及到幾個屬性

fileSizeThreshold:緩沖區文件的大小 如果上傳的文件的超過了緩沖區的值 那么就會生成一個臨時文件存放到指定目錄中 緩沖區的大小默認是10KB
maxFileSize:單個文件上傳的大小
maxRequestSize :總共上傳文件的最大值 
location:文件上傳的位置

注意一點當我們上傳了多個文件名相同的文件時 上傳的文件會覆蓋掉前面上傳的文件 但是可能只是文件名相同文件的內容不同 這時該怎么辦呢?
這里提供了兩種方法
第一種方法 我們可以在輸出流中添加系統時間 以為每次我上傳文件的時候時間是不同的
第二種方法
還可以使用java中提供的UUID通用唯一識別碼 UUID是唯一的
  String uuid = UUID.randomUUID().toString();
 1package com.newroad.upload;  2 import java.io.File;  3 import java.io.FileInputStream;  4 import java.io.FileOutputStream;  5 import java.io.IOException;  6 import java.io.InputStream;  7 import java.io.PrintWriter;  8 import java.util.Collection;  9 import java.util.UUID; 10 import javax.servlet.ServletException; 11 import javax.servlet.annotation.MultipartConfig; 12 import javax.servlet.annotation.WebServlet; 13 import javax.servlet.http.HttpServlet; 14 import javax.servlet.http.HttpServletRequest; 15 import javax.servlet.http.HttpServletResponse; 16 import javax.servlet.http.Part; 17 @WebServlet("/upload02.do") 18 @MultipartConfig 19 /*@MultipartConfig(fileSizeThreshold=1024*50,location="d:/test1",maxFileSize=1024*1024,maxRequestSize=1024*1024)*/ 20 @SuppressWarnings("serial") 21 public class UpLoadServlet2 extends HttpServlet{ 22 23  @Override 24 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 25 //獲得所有的前台傳遞的數據部分,包含文件,包含文本 26 Collection<Part> parts = request.getParts(); 27 //遍歷集合 28 for(Part part : parts) { 29 if(!part.getName().equals("file")) { 30 continue ; 31  } 32 //獲得這個文件的名稱 33 String fileName = part.getSubmittedFileName(); 34 //將文件保存到指定的位置 我們約定的位置在 webapp/upload/ch10_01 35 String realpath = request.getServletContext().getRealPath(""); 36 //獲得webapp的真實路徑 37 File webappPath = new File(realpath).getParentFile(); 38 //獲得約定的路徑的File對象 39 File uploadDi = new File(webappPath,"upload"+request.getContextPath()); 40 //為了避免首次上傳,文件夾找不到 創建文件夾 41  uploadDi.mkdirs(); 42 //創建UUID 43 String uuid = UUID.randomUUID().toString(); 44  System.out.println(uuid); 45 FileOutputStream out = new FileOutputStream(new File(uploadDi,System.currentTimeMillis()+"_"+fileName)); 46 //獲取輸入流 47 InputStream in = part.getInputStream(); 48 //創建緩沖區 49 byte[] b = new byte[1024]; 50 int num=0 ; 51 //循環將輸入流中的數據讀到緩沖區中 52 while((num=in.read(b))!=-1) { 53 out.write(b, 0, num); 54  } 55  in.close(); 56  out.close(); 57  } 58 //響應上傳結果 59 response.setCharacterEncoding("utf-8"); 60 response.setContentType("text/html;charset=utf-8"); 61 62 PrintWriter writer = response.getWriter(); 63 writer.write("上傳成功"); 64  writer.close(); 65 66 67  } 68 69  @Override 70 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 71  doGet(req, resp); 72  } 73 }

2.圖片上傳以及回顯

經常我們會看到當我們在qq或者其他軟件中上傳圖片的時候 就會把上傳的圖片顯示出來 接下來來實現這個功能

注意以下

 contentType : false 必須是false,才能夠被設置正確的內容類型
 processData : false 告訴jquery不要對數據做處理,如果不設置,那么jquery會按照它的規則對數據進行處理 
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"  2 pageEncoding="UTF-8"%>  3 <%  4 String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()  5 + request.getContextPath() + "/";  6 %>  7 <!DOCTYPE html>  8 <html>  9 <head> 10 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 11 <base href="<%=basePath%>"> 12 <title>使用ajax上傳圖片后,回顯至頁面</title> 13 <script type="text/javascript" src="js/jquery.js"></script> 14 <script type="text/javascript"> 15  $(function() { 16 $("input[type=submit]").on("click", function() { 17 //阻滯默認提交時間 18  event.preventDefault(); 19 //數據需要使用到FormData這個對象,將表單中的數據封裝到FormData對象中 20 //獲得表單對象,不能使用jquery的方式,必須使用原生js來獲取 21 var form = document.getElementById("p1"); 22 var formData = new FormData(form); 23  $.ajax({ 24 url : "upload03.do", 25  data : formData, 26 type : "POST", 27 //必須是false,才能夠被設置正確的內容類型 28 contentType : false, 29 //告訴jquery不要對數據做處理,如果不設置,那么jquery會按照它的規則對數據進行處理 30 processData : false, 31 //設置上傳成功之后 回顯圖片 32  success : function(data) { 33 if (data.path) { 34 $("#p1").css("display", "inline"); 35 $("#p1").attr("src", "../" + data.path); 36  } 37 38  } 39 40  }) 41 42  }) 43 44  }) 45 </script> 46 <style type="text/css"> 47 #p1 { 48  width: 200px; 49  display: none; 50  height: 200px; 51 } 52 </style> 53 </head> 54 <body> 55 <form id="ff"> 56 <input type="file" name="file" accept="image/jpeg,image/png,image/gif"><br> 57 <input type="submit" value="准備上傳">
<img id="p1"> 58 </form> 59 </body> 60 </html>

圖片上傳回顯其實就是將 圖片上傳成功后將拿到圖片的地址 然后 通過ajax拿到圖片的地址 並設置圖片的顯示方式

 1 package com.newroad.upload;  2 import java.io.File;  3 import java.io.FileOutputStream;  4 import java.io.IOException;  5 import java.io.InputStream;  6 import java.io.PrintWriter;  7 import javax.servlet.ServletException;  8 import javax.servlet.annotation.MultipartConfig;  9 import javax.servlet.annotation.WebServlet; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 import javax.servlet.http.Part; 14 15 import com.alibaba.fastjson.JSONObject; 16 17 @WebServlet("/upload03.do") 18 @MultipartConfig 19 @SuppressWarnings("serial") 20 public class UpLoadServlet3 extends HttpServlet { 21 22  @Override 23 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 24 //獲取上傳的文件 通過input標簽中的name屬性值獲得相應的Part對象 25 Part part = request.getPart("file"); 26 //獲取文件名稱 27 String fileName =part.getSubmittedFileName(); 28 //獲得tomcat的目錄 29 String realPath =request.getServletContext().getRealPath(""); 30 File parentFile = new File(realPath).getParentFile(); 31 File uploadDi = new File(parentFile,"upload"+request.getContextPath()); 32 //創建文件夾 33  uploadDi.mkdirs(); 34 //將文件寫出到硬盤中 35 FileOutputStream out = new FileOutputStream(new File(uploadDi,fileName)); 36 //獲得輸入流 37 InputStream in = part.getInputStream(); 38 //創建一個緩沖區 39 byte[] b = new byte[1024*3]; 40 //判斷輸入流中的數據讀完的標志 41 int num = 0 ; 42 //循環將輸入流中的數據讀取到緩沖區中 判斷讀完的標志是num=in.read(b)>0 43 while((num=in.read(b)) !=-1) { 44 //將緩沖區的數據寫到指定的目錄中 45 out.write(b, 0, num); 46  }
out.close(); 48 in.close(); 49 50 //響應信息 51 response.setCharacterEncoding("utf-8"); 52 response.setContentType("application/json;charset=utf-8"); 53 PrintWriter writer = response.getWriter(); 54 //將圖片地址響應給前端 55 String path = "upload"+request.getContextPath()+"/"+fileName ; 56 JSONObject jobj = new JSONObject(); 57 jobj.put("path", path); 58 59 writer.write(jobj.toJSONString()); 60 writer.close(); 61 } 62 63 @Override 64 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 65 doGet(req, resp); 66 } 67 68 }

 

3.文件下載

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3     <%
 4        String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";  5     %>
 6 <!DOCTYPE html>
 7 <html>
 8 <head>
 9 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
10    <base href="<%=basePath%>">
11 <title>下載文件</title>
12 </head>
13 <body>
14  <h2>文本文檔</h2><a href="download.do?file=端口號別站用.txt">端口號別站用</a>
15  <h2>學習視頻</h2><a href="download.do?file=用戶角色權限.wmv">用戶角色權限</a>
16 
17 </body>
18 </html>

DownLoadServlet

注意

當我們下載一個中文名的文件的時候可能會出現亂碼 這時需要設置響應頭的信息

Content-Disposition 響應頭的格式為 inline|attachment;filename=文件名

  inline表示如果該資源瀏覽器能夠直接展示,則直接展示,否則下載,attachment表示直接以附件形式下載

 如果文件有中文名 這時可以使用URLEncoder.encode方法,將文件名編碼成unicode碼

 1 package com.newroad.upload;  2 import java.io.File;  3 import java.io.FileInputStream;  4 import java.io.IOException;  5 import java.io.OutputStream;  6 import java.io.PrintWriter;  7 import java.net.URLEncoder;  8 import javax.servlet.ServletException;  9 import javax.servlet.annotation.WebServlet; 10 import javax.servlet.http.HttpServlet; 11 import javax.servlet.http.HttpServletRequest; 12 import javax.servlet.http.HttpServletResponse; 13 @WebServlet("/download.do") 14 @SuppressWarnings("serial") 15 public class DownLoadServlet extends HttpServlet { 16  @Override 17 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 18 req.setCharacterEncoding("utf-8"); 19 resp.setCharacterEncoding("utf-8"); 20 // 獲得到參數中的下載文件的名字 21 String filename = req.getParameter("file"); 22  System.out.println(filename); 23 File file = new File("D:/" + filename); 24 if (file.exists()) { 25 /* 26  * 設置響應頭信息,Content-Disposition 響應頭的格式為 inline|attachment;filename=文件名 27  * inline表示如果該資源瀏覽器能夠直接展示,則直接展示,否則下載,attachment表示直接以附件形式下載 28  * 如果文件名中有中文,那么下載時,會出現中文亂碼,這時可以使用URLEncoder.encode方法,將文件名編碼成unicode碼 29 */ 30 String contentDisposition = "attachment;filename=" + URLEncoder.encode(file.getName(), "utf-8"); 31 resp.setHeader("Content-Disposition", contentDisposition); 32 // 創建文件字節讀取流對象時,必須明確與之關聯的數據源。 33 FileInputStream in = new FileInputStream(file); 34 // 獲取輸出流 35 OutputStream oStream = resp.getOutputStream(); 36 // 創建緩沖區 37 byte[] b = new byte[1024 * 3]; 38 // number用來判斷輸入流讀完的標記 39 int number; 40 // 循環讀取輸入流中的數據到緩沖區中 41 while ((number = in.read(b)) != -1) { 42 oStream.write(b, 0, number); 43  } 44  oStream.close(); 45  in.close(); 46 } else { 47 resp.setContentType("text/html;charset=utf-8"); 48 PrintWriter writer = resp.getWriter(); 49 writer.write("該文件丟失了"); 50  writer.close(); 51  } 52 53  } 54 55  @Override 56 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 57 58  doGet(req, resp); 59  } 60 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM