Javaweb之實現文件上傳+點擊下載功能

      網友投稿 1313 2022-05-29

      Javaweb之實現文件上傳+點擊下載功能

      實現目標:

      1、編寫index.jsp,可以進行文件上傳

      2、上傳成功后跳回index.jsp,并把上傳的文件名顯示在index.jsp中(用a標簽顯示)。

      3、點擊文件名,可下載文件

      準備工具:

      IntelliJ IDEA 2019.2.3 x64

      apache-tomcat-8.5.15

      JSP?標準標簽庫(JSTL)

      首先,簡單編寫Index,jsp的上傳頁面

      <%--?Created?by?IntelliJ?IDEA.?--%> <%@?page?contentType="text/html;charset=UTF-8"?language="java"?%> ?? ????upload?&&?download ?? ?? ?? ??//enctype?屬性規定在發送到服務器之前應該如何對表單數據進行編碼。 ??//不對字符編碼。在使用包含文件上傳控件的表單時,必須使用該值 ??? ?? ???? ???? ???? ???? ?? ??

      再來編寫UploadServlet.java的實現上傳的IO

      package?com.blb.servlet; import?javax.servlet.ServletException; import?javax.servlet.annotation.MultipartConfig; import?javax.servlet.annotation.WebServlet; import?javax.servlet.http.HttpServlet; import?javax.servlet.http.HttpServletRequest; import?javax.servlet.http.HttpServletResponse; import?javax.servlet.http.Part; import?java.io.*; import?java.nio.file.Path; //支持二進制處理 @MultipartConfig @WebServlet("/upload")?//映射路徑 public?class?UploadServlet?extends?HttpServlet?{ ????String?path="d:/upload/";??//上傳的路徑?這里我設置的是d盤的upload文件夾下 ????@Override ????protected?void?service(HttpServletRequest?req,?HttpServletResponse?resp)?throws?ServletException,?IOException?{ ???? ????????Part?file?=?req.getPart("file"); ????????//獲取提交的文件名 ????????String?fileName?=?file.getSubmittedFileName(); ????????//獲取文件的輸入流 ????????InputStream?inputStream?=?file.getInputStream(); ????????//獲取的文件傳到path路徑 ????????FileOutputStream?fileOutputStream?=?new?FileOutputStream(path+fileName); ????????byte[]?data?=?new?byte[1024]; ????????int?len; ????????while?((len=inputStream.read(data))!=-1){???//?表示從InputStream中讀取一個數組的數據,如果返回-1?則表示數據讀取完成了。 ????????????fileOutputStream.write(data,0,len); ????????????//循環讀取數據 ????????} ???????inputStream.close(); ??????fileOutputStream.close();??//關閉IO流 ????} }

      檢查一下,沒什么錯誤,試著看看效果

      選擇一個圖片文件

      點擊上傳后

      檢查D:/upload下是否有這個文件

      證明咱們這個邏輯沒問題哈,已經能實現上傳到指定路徑了

      接著實現上傳成功后跳回index.jsp,并把上傳的文件名顯示在index.jsp中(用a標簽顯示)。

      這里先導入一個jstl的jsp

      一定要在WEB-INF下導入,然后右鍵jstl選擇 as a libray

      導入完成后在jsp頭部加入一個引入標簽,然后在主體里加入forEach遍歷這個上傳的文件list 顯示在瀏覽器的頁面上

      <%--?Created?by?IntelliJ?IDEA.?--%> <%@?page?contentType="text/html;charset=UTF-8"?language="java"?%> <%@?taglib?prefix="c"?uri="http://java.sun.com/jsp/jstl/core"?%>?//jstl引入標簽 ?? ???? ?? ?? ?? ???? ???? ?? ??

      文件列表

      ?? ????${file}
      ??//上傳文件的名字的顯示在a標簽內 ?? ??

      接著寫實現點擊a標簽下載上傳后的文件的功能代碼DownloadServlet.java

      package?com.blb.servlet; import?javax.servlet.ServletException; import?javax.servlet.ServletOutputStream; import?javax.servlet.annotation.MultipartConfig; import?javax.servlet.annotation.WebServlet; import?javax.servlet.http.HttpServlet; import?javax.servlet.http.HttpServletRequest; import?javax.servlet.http.HttpServletResponse; import?javax.xml.ws.Service; import?java.io.FileInputStream; import?java.io.IOException; @MultipartConfig @WebServlet("/download") public?class?DownloadServlet??extends?HttpServlet?{ ????String?path="D:/"; ????@Override ????protected?void?service(HttpServletRequest?req,?HttpServletResponse?resp)?throws?ServletException,?IOException?{ ????????//要下載的文件名 ????????String?file?=?req.getParameter("file"); ????????//取得文件輸入流 ????????FileInputStream?fileInputStream?=?new?FileInputStream(path?+?file); ???????? ????????//獲得輸出流 ????????ServletOutputStream?outputStream?=?resp.getOutputStream(); ????????//將文件名轉碼 ????????String?fileName?=?new?String(file.getBytes(),?"iso-8859-1"); ????????resp.setContentType("application/octet-stream");????//告訴瀏覽器我這是一個二進制文件 ????????resp.setHeader("Content-Disposition",?"attachment;filename="?+?fileName);???//告訴瀏覽器文件名是什么 ????????resp.setContentLength(fileInputStream.available());?????????//告訴瀏覽器文件的大小是多少 ????????//IO流寫操作,向客戶端寫內容 ????????byte[]?data?=?new?byte[1024]; ????????int?len; ????????while?((len=fileInputStream.read(data))!=-1){ ????????????outputStream.write(data,?0,?len); ????????} ????????fileInputStream.close(); ????????outputStream.close(); ????} }

      接著來試試效果

      nice,基本的效果都已經實現了,但是還是要優化之處,比如:

      1、閱讀IOUtis,把讀寫操作進行封裝起來方便調用

      Javaweb之實現文件上傳+點擊下載功能

      package?com.blb.utils; import?javax.servlet.http.HttpServletResponse; import?java.io.IOException; import?java.io.InputStream; import?java.io.OutputStream; import?java.io.UnsupportedEncodingException; public?class?IOUtils?{ ????/** ?????*?輸入輸出流讀取操作封裝 ?????*?@param?inputStream ?????*?@param?outputStream ?????*?@throws?IOException ?????*/ ????public?static?void?readAndWriter(InputStream?inputStream,?OutputStream?outputStream)?throws?IOException?{ ????????byte[]?data?=?new?byte[1024]; ????????int?len; ????????while?((len=inputStream.read(data))!=-1){ ????????????outputStream.write(data,?0,?len); ????????} ????????inputStream.close(); ????????outputStream.close(); ????} ????/** ?????*?下載配置 ?????*?@param?resp ?????*?@param?file ?????*?@param?length ?????*?@throws?UnsupportedEncodingException ?????*/ ????public?static?void?downloadConfig(HttpServletResponse?resp,?String?file,?int?length)?throws?UnsupportedEncodingException?{ ????????String?fileName?=?new?String(file.getBytes(),?"iso-8859-1"); ????????resp.setContentType("application/octet-stream"); ????????resp.setContentLength(length); ????????resp.setHeader("Content-Disposition",?"attachment;filename="?+?fileName?); ????} }

      2、下載前先判斷文件是否存在

      在DownloadServlet里添加如下代碼:

      if?(!file1.exists())?{ ????req.setAttribute("msg",?"文件不存在"); ????req.getRequestDispatcher("index.jsp").forward(req,?resp); ????return; }?????//判斷文件是否存在

      然后在index.jsp里加一個綁定數據${msg}實現傳遞

      文件列表

      ${msg} ??${file}

      3、服務器重啟后,文件列表丟失問題

      第一次進來時,文件列表不能正常顯示問題

      package?com.blb.servlet; import?javax.servlet.ServletException; 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.IOException; @WebServlet("/index") public?class?IndexServlet?extends?HttpServlet?{ //????String?path?=?"D:/upload/"; ????@Override ????protected?void?service(HttpServletRequest?req,?HttpServletResponse?resp)?throws?ServletException,?IOException?{ ????????File?dir?=?new?File("D:/upload/"); ????????String[]?list?=?dir.list(); ????????//把存放文件名集合的list放到session作用域中 ????????req.getSession().setAttribute("files",?list); ????????resp.sendRedirect("index.jsp");?//重定向 ????} }

      最后的最后,這個小項目到這里結束了,歡迎大家指正??!

      Java JSP

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:瀏覽器緩存簡介及官網緩存策略分析
      下一篇:如何降低軟件復雜性?讓代碼更加精簡
      相關文章
      jjzz亚洲亚洲女人| 亚洲VA中文字幕无码毛片 | 亚洲精品99久久久久中文字幕 | 亚洲情侣偷拍精品| 91亚洲国产成人精品下载| 亚洲中文字幕第一页在线| 亚洲国产精品一区二区三区在线观看 | 国产综合成人亚洲区| 亚洲中文无码亚洲人成影院| 亚洲国产精品免费在线观看| 亚洲美女精品视频| 久久亚洲sm情趣捆绑调教| 亚洲色欲或者高潮影院| 亚洲国产精品一区| 亚洲综合视频在线观看| 亚洲第一网站免费视频| 亚洲免费观看在线视频| 亚洲一级片在线观看| 亚洲一卡2卡3卡4卡乱码 在线 | 亚洲人成人一区二区三区| 亚洲熟女一区二区三区| 精品亚洲永久免费精品| 亚洲福利在线视频| 亚洲春色另类小说| 亚洲一区在线观看视频| 亚洲午夜精品一区二区麻豆| 久久亚洲精品无码av| 亚洲片国产一区一级在线观看| 国产亚洲精品无码专区| 亚洲国产精品无码久久一区二区| 久久久久亚洲精品美女| 78成人精品电影在线播放日韩精品电影一区亚洲 | 亚洲天堂在线视频| 亚洲人成网站在线播放vr| 久久精品国产亚洲AV麻豆王友容| 亚洲电影一区二区三区| 亚洲黄色免费网站| 亚洲自偷自偷在线成人网站传媒 | 国产亚洲Av综合人人澡精品| 亚洲男人在线无码视频| 国产亚洲综合色就色|