Javaweb之實現文件上傳+點擊下載功能【奔跑吧!JAVA】

      網友投稿 911 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下是否有這個文件

      Javaweb之實現文件上傳+點擊下載功能【奔跑吧!JAVA】

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

      接著實現上傳成功后跳回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,把讀寫操作進行封裝起來方便調用

      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】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/265241

      Java web前端

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

      上一篇:2021年終總結--一個即將畢業的大學生
      下一篇:shell-01-基礎知識
      相關文章
      久久亚洲美女精品国产精品| 久久精品亚洲一区二区| 亚洲狠狠久久综合一区77777| 在线观看亚洲视频| 亚洲欧美乱色情图片| 自拍日韩亚洲一区在线| 精品亚洲AV无码一区二区三区| 亚洲电影在线播放| 亚洲国产亚洲综合在线尤物| 亚洲精品免费在线| 亚洲六月丁香六月婷婷蜜芽| 亚洲国产成AV人天堂无码| 亚洲人成电影青青在线播放| 亚洲一区二区三区国产精品无码| 亚洲美女一区二区三区| 亚洲综合免费视频| 亚洲熟妇无码爱v在线观看| 亚洲精品乱码久久久久久下载| 亚洲小视频在线播放| 亚洲人成影院午夜网站| 亚洲AV无码一区二区三区人| 午夜在线a亚洲v天堂网2019| 亚洲无码一区二区三区 | 亚洲欧美不卡高清在线| 亚洲乱妇老熟女爽到高潮的片| 亚洲欧洲免费无码| 处破女第一次亚洲18分钟| 亚洲日本一区二区一本一道| 久久亚洲中文字幕精品一区四| 亚洲夜夜欢A∨一区二区三区| 亚洲成AV人片一区二区密柚| 亚洲AV人无码激艳猛片| 亚洲精品资源在线| 亚洲娇小性色xxxx| 亚洲精华国产精华精华液| 婷婷亚洲天堂影院| 日韩国产欧美亚洲v片| 亚洲国产精品国产自在在线| 国产午夜亚洲精品不卡电影| 亚洲日本中文字幕一区二区三区| 亚洲精品WWW久久久久久|