本文實例為大家分享了java實現文件上傳和下載的具體代碼,供大家參考,具體內容如下
文件的上傳
upload:文件上傳
客戶端通過表單的文件域file 把客戶端的文件 上傳保存到服務器的硬盤上
頁面
首先對上傳的表單有以下要求:
- 必須有文件域:input type=file
- 表單提交方式:method=post
- 表單的 enctype=multipart/form-data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
< form method = "post" action = "/user/regist" enctype = "multipart/form-data" > < table style = "border: chartreuse;solid:2px" > < tr > < th >用戶名</ th > < td >< input type = "text" name = "username" ></ td > </ tr > < tr > < th >密碼</ th > < td >< input type = "password" name = "password" ></ td > </ tr > < tr > < th >用戶頭像</ th > < td >< input type = "file" name = "photo" > </ td > </ tr > < tr > < td colspan = "2" >< input type = "submit" value = "提交" ></ td > </ tr > </ table > </ form > |
Servlet
1)首先要導入以下兩個jar包,通過commons-fileupload實現文件上傳
2)創建一個工廠對象DiskFileItemFactory,在創建一個多部件表單解析器ServletFileUpload,構造方法傳入工廠對象
3)解析器解析請求對象,獲得一個list集合,其中list集合存儲的是一個一個的fileItem對象,一個fileItem對應一個組件,也就是一個<input>
4) 遍歷集合用isFormField()方法判斷是否為普通組件,然后著重處理文件域組件
5)獲取文件名,并用getRealPath方法獲取服務器上傳文件所在路徑,創建新文件夾
6)獲取輸入流和創建輸出流,進行文件的讀寫
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
@WebServlet (value = "/user/regist" ) public class UploadServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //創建一個工廠對象 DiskFileItemFactory factory = new DiskFileItemFactory(); //創建一個多部件解析器對象 ServletFileUpload fileUpload = new ServletFileUpload(factory); User user = new User(); FileOutputStream out= null ; try { //用解析器對象解析請求,返回一個FileItem類型的集合 List<FileItem> list = fileUpload.parseRequest(req); for (FileItem fileItem : list) { /** * fileItem.getFieldName());:::獲取組件的name值 * fileItem.getName());::::獲取文件域的文件名 * fileItem.getSize());::::獲取數據的字節個數 * fileItem.getString());::::獲取數據的字符串 * fileItem.isFormField());:::判斷是否為普通組件 */ //判斷部件是否為普通組件 if (fileItem.isFormField()) { //普通組件 //獲取組件名字也就是name的值 String fieldName = fileItem.getFieldName(); //獲取組件的值也就是value的值 String value = fileItem.getString( "utf-8" ); if ( "username" .equals(fieldName)) { //設置實體類的屬性 user.setUsername(value); } else if ( "password" .equals(fieldName)) { user.setPassword(value); } } else { // 文件域 //獲取文件名 String fielName = fileItem.getName(); //輸入流來讀數據 InputStream in = fileItem.getInputStream(); //設置文件寫出的路徑,并用隨機碼來保證圖片可以重復 String path=req.getServletContext().getRealPath( "/imgs/" + UUID.randomUUID()+fielName); System.out.println( "文件路徑為:" +path); File file = new File(path); out = new FileOutputStream(file); //利用commons-io-1.4.jar的IOUtils的copy方法直接實現文件的復制 IOUtils.copy(in,out); user.setPhoto(file.getName()); } } } catch (Exception e) { e.printStackTrace(); } finally { if (out!= null ){ out.close(); } } req.getSession().setAttribute( "user" ,user); req.getRequestDispatcher( "/sucess.jsp" ).forward(req,resp); } } |
文件的下載
頁面
只需一個超鏈接,傳需要下載的文件名,或者直接輸入路徑在瀏覽器
例: <a href="<c:url value='/file/download?fileName=14.jpg'/>" >狗狗1</a><br/>
Servlet
1)接收參數,獲取文件名
2)獲取imgs的路徑,也就是存儲文件的文件夾的路徑,然后創建文件,傳入該路徑和文件名
3)創建輸入流讀取文件
4)設置響應頭,首先根據文件名字獲取文件的大類型,設置響應頭Content-Type指定響應的類型;設置響應頭Content-Disposition,指定文件以附件形式保存到本地磁盤
5)用響應獲取輸出流,讀出文件到客戶端
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
@WebServlet ( "/user/download" ) public class DownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding( "UTF-8" ); //獲取要下載的文件名 String fileName = request.getParameter( "fileName" ); System.out.println(fileName); //獲取服務器中存儲圖片的文件夾的路徑 String path1 = request.getServletContext().getRealPath( "/imgs" ); String path=path1+ "/" +fileName; File file = new File(path); //創建輸入流讀文件 FileInputStream in = new FileInputStream(file); //通過文件名字獲取文件的大類型 String type = request.getServletContext().getMimeType(fileName); //設置響應頭ContentType指定響應內容的類型 response.setHeader( "Content-type" ,type); //設置響應頭Content-Disposition 指定以附件形式保存響應的信息 response.setHeader( "Content-Disposition" , "attachment;filename=" +(URLEncoder.encode(fileName, "utf-8" ))); ServletOutputStream out = response.getOutputStream(); //實現文件的讀寫 IOUtils.copy(in,out); if (in!= null ){ in.close(); } } } |
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/weixin_45943192/article/details/120834578