Servlet p8 文件的上傳和下載

来源:https://www.cnblogs.com/zh-Note/archive/2023/07/12/17526270.html
-Advertisement-
Play Games

# 文件的上傳和下載 在上網的時候我們常常遇到文件上傳的情況,例如上傳頭像、上傳資料等:當然除了上傳,遇見下載的情況 也很多,接下來看看我們servlet中怎麼實現文件的上傳和下載。 ## 文件上傳 文件上傳涉及到前臺頁面的編寫和後臺伺服器端代碼的編寫,前臺發送文件,後臺接收並保存文件,這才是 一個 ...


文件的上傳和下載

在上網的時候我們常常遇到文件上傳的情況,例如上傳頭像、上傳資料等:當然除了上傳,遇見下載的情況
也很多,接下來看看我們servlet中怎麼實現文件的上傳和下載。

文件上傳

文件上傳涉及到前臺頁面的編寫和後臺伺服器端代碼的編寫,前臺發送文件,後臺接收並保存文件,這才是
一個完整的文件上傳。

前臺頁面

在做文件上傳的時候,會有一個上傳文件的界面,首先我們需要一個表單,並目表單的請求方式為POST;其次我們的form表單的enctype必須設為 "multipart/form-data",enctype="multipart/form-data”,意思是設置表單的類型為文件上傳表單,預設情況下這個表單類型是 "application/.x-www-form-urlencoded",不能用於文件上傳,只有使用了multipart/form-data才能完整地傳遞文件數據。

前臺頁面代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上傳</title>
</head>
<body>
    <!--
        文件上傳
        1. 準備表單
        2. 設置表單的提交類型為 POST請求, method="post"
        3. 設置表單的類型為文件上傳表單 enctype="multipart/form-data"
        4. 設置文件提交的地址
        5. 準備表單元素
            1. 普通的表單項 type="text"
            2. 文件項 type="file"
        6. 設置表單元素的name屬性值(表單提交一定要設置表單元素的name屬性值,否則後臺無法接收數據)
        -->
    <form method="post" enctype="multipart/form-data" action="uploadServlet">
        姓名:<input type="text" name="uname"><br>
        文件:<input type="file" name="myfile"><br>
        <!-- button按鈕的預設類型是 submit-->
        <button>提交</button>
    </form>
</body>
</html>

後臺實現

使用註解 @MultipartConfig 將一個Servlet標識為支持文件上傳。Servlet將multipart/form-data的
POST請求封裝成Part,通過Part對上傳的文件進行操作。

代碼實現:

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.IOException;

/**
 * @author: 86199
 * @date: 2023/7/3 15:34
 * Description: 文件上傳後臺代碼
 */

@WebServlet("/uploadServlet")
@MultipartConfig //如果是文件上傳,必須設置該註解
public class uploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("文件上傳....");

        //設置請求的編碼格式
        req.setCharacterEncoding("UTF-8");

        //獲取普通表單項
        String uname = req.getParameter("uname");
        System.out.println("uname = " + uname);

        //文件上傳表單
        //獲取part對象(Servlet 會將 multipart/form-data 的Post請求封裝成一個Part對象)
        Part part = req.getPart("myfile");

        //獲取文件名
        String fileName = part.getSubmittedFileName();
        System.out.println("上傳文件名 " + fileName);

        //文件存放路徑
        String realPath = req.getServletContext().getRealPath("/");
        System.out.println("文件存放路徑:" + realPath);

        //上傳文件到指定目錄
        part.write(realPath + "/" + fileName);
    }
}

文件下載

文件下載

文件下載,即將服務留上的資源下載(拷貝)到本地,我們可以通過兩種方式下載。第一種是通過超鏈接本
身的特性來下載;第二種是通過代碼下載,

超鏈接下載

當我們在HTML或SP頁面中使用標簽時,原意是希望能夠進行跳轉,但當超鏈接遇到瀏覽器不識別的資源
時會自動下載:當遇見劉覽器能夠直接顯示的資源,瀏覽器就會預設顯示出來,比如txt、pg、jPg等。當然我們
也可以通過download屬性規定瀏覽器進行下載。但有些瀏覽器並不支持。

預設下載:

<!-- 當超時接遭到瀏覽器不識別的資時,會自動下載,遇到可識別會顯示其內容 -->
<a href="test.zip">文本文件</a>

指定download屬性下載:

<!--當超接遇到瀏覽器識別的資源時,預設不會下載,但是通過down1oad屬性可進行下載-->
<a href="test.txt download">文本文件</a

download屬性可以不寫任何信息,會自動使用預設文件名,如果設置了download屬性的值,則使用設置的
值做為文件名。當用戶打開瀏覽器點擊鏈接的時候就會直接下載文件。

後臺實現下載

實現步驟:

  1. 需要同通過 response.setContentType 方法設置 Content-typpe 頭欄位的值,讓瀏覽器無法使用某種方式或激活某個程式來處理的 MIME 類型,例如 "application/octet-stream" 或 "application/x-msdownload" 等。
  2. 需要通過 response.setHeader 方法設置 Content-Disposition 頭的值為 "attachment;filename=文件名"。
  3. 讀取需要下載的文件,調用 response.getOutputStream 方法向客戶端寫入附件內容。

代碼演示:

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
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.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @author: 86199
 * @date: 2023/7/3 17:07
 * Description: 後臺代碼實現文件下載
 */

@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("文件下載...");

        //設置請求編碼
        req.setCharacterEncoding("UTF-8");

        //獲取參數,獲取要下載的文件名
        String fileName = req.getParameter("fileName");

        //trim() 去除字元串前後的空格
        if(fileName != null && "".equals(fileName.trim())){
            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("請輸入要下載的文件名");
            resp.getWriter().close();
            return;
        }

        //獲取文件的存放路徑
        String filePath = req.getServletContext().getRealPath("/download/");
        File file = new File(filePath + fileName);
        //判斷文件是否存在,並且是一個標準文件
        if(file.exists() && file.isFile()){
            //設置響應類型為瀏覽器不能識別的
            resp.setContentType("application/x-msdownload");

            //設置響應頭
            resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);

            //得到文件輸入流
            FileInputStream in = new FileInputStream(file);
            //得到位元組輸出流
            ServletOutputStream out = resp.getOutputStream();

            byte[] bytes = new byte[1024];
            int readLen = 0;
            while ((readLen = in.read(bytes)) != -1){
                out.write(bytes, 0, readLen);
            }
            in.close();
            out.close();

        }else {
            resp.setContentType("text/html;charset=UTF-8");
            resp.getWriter().write("文件不存在請重試...");
            resp.getWriter().close();
        }
    }
}


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ## 引言 **責任鏈模式**是一種行為型設計模式,它通過一條由多個處理器組成的鏈來處理請求,每個處理器都有機會處理請求,如果一個處理器不能處理該請求,它會將請求傳遞給下一個處理器,直到請求被處理為止。 在實際應用中,責任鏈模式常用於處理請求的分發、事件處理等場景,它的優點在於可以動態地添加、刪除處 ...
  • 一、表結構設計 二、實現思路 1.系統啟動時將字典數據載入到redis作為可選常量池,以及mapper.xml、dao、數據規則信息載入到redis 2.用訪問時通過springmvc攔截器對用戶進行攔截獲取token然後通過RSA解密獲取用戶信息,將用戶信息,以及請求參數加入本地線程 3.myba ...
  • 相信熟悉 Golang 的小伙伴不少都知道 `條件編譯` 這個事,最近項目中也可能會用到這個東西。所以特意重新學習下,記錄下學習的過程。這樣用的時候記不住了,還可以直接過來看自己的筆記。 > 文章很多內容來源於參考資料,感謝。 ### 1、條件編譯簡介 #### 1.1、為什麼需要條件編譯 在實際的 ...
  • # Java 封裝 # 1. 封裝 ## 封裝就是把抽象的數據和方法進行封裝,數據在內部通過授權的方法來進行數據的操作,例如遙控器通過按鈕對電視機的操作。 ## 封裝的好處: > ## 隱藏實現細節 > > ## 校驗並保護數據的安全 ## 封裝的三步驟: > ## 對屬性進行私有化 > > ## ...
  • # 一、vue複習 ## 1.vue的使用步驟: (1)導入vue.js (2)創建除body以外最大的div標簽,給定id值 (3)創建vue對象 ```bash new Vue({ el:"#app", data:{}//定義變數 methods:{} //定義方法 ``` ## 2.vue語法 ...
  • Docker提供了一個名為**Docker Desktop**的桌面應用程式,簡化了安裝和設置過程。還有另一個選項可以使用**Docker引擎**進行安裝。 - [Docker Desktop網站](https://www.docker.com/products/docker-desktop/) - ...
  • 使用easyExcel在導入數據事有很好的使用性,方便操作。 添加依賴: <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.0.5</version> </depende ...
  • 本文旨在簡明扼要說明各回收器調優參數,如有疏漏歡迎指正。 #### 1、JDK版本 以下所有優化全部基於JDK8版本,強烈建議低版本升級到JDK8,並儘可能使用update_191以後版本。 #### 2、如何選擇垃圾回收器 響應優先應用:面向C端對響應時間敏感的應用,堆記憶體8G以上建議選擇G1,堆 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...