最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaWeb?Servlet實(shí)現(xiàn)文件上傳與下載功能實(shí)例

 更新時(shí)間:2022年04月29日 10:21:18   作者:CoderX(遠(yuǎn)離BUG)  
因自己負(fù)責(zé)的項(xiàng)目中需要實(shí)現(xiàn)文件上傳,所以下面下面這篇文章主要給大家介紹了關(guān)于JavaWeb?Servlet實(shí)現(xiàn)文件上傳與下載功能的相關(guān)資料,需要的朋友可以參考下

前言

在上網(wǎng)的時(shí)候我們常常遇到文件上傳的情況,例如上傳頭像、上傳資料等;當(dāng)然除了上傳,遇見下載的情況也很多,接下來(lái)看看我們 servlet 中怎么實(shí)現(xiàn)文件的上傳和下載。

項(xiàng)目準(zhǔn)備

idea:2020.1

jdk:1.8

tomcat:10

項(xiàng)目模板:java Enterprise–>Web Application

文件上傳

文件上傳涉及到前臺(tái)頁(yè)面的編寫和后臺(tái)服務(wù)器端代碼的編寫,前臺(tái)發(fā)送文件,后臺(tái)接收并保存文件,這才是一個(gè)完整的文件上傳。

前臺(tái)頁(yè)面

在做文件上傳的時(shí)候,會(huì)有一個(gè)上傳文件的界面,首先我們需要一個(gè)表單,并且表單的請(qǐng)求方式為 POST;其次我們的 form 表單的 enctype 必須設(shè)為"multipart/form-data",即 enctype=“multipart/form-data”,意思是設(shè)置表單的類型為文件上傳表單。默認(rèn)情況下這個(gè)表單類型是 “application/x-www-form-urlencoded”, 不能用于文件上傳。只有使用了multipart/form-data 才能完整地傳遞文件數(shù)據(jù)。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件上傳</title>
</head>
<body>
<!--文件上傳
    1. 準(zhǔn)備表單
    2.設(shè)置表單提交類型為POST method="POST"
    3.設(shè)置表單類型為文件上傳表單 enctype="multipart/form-data"
    4.設(shè)置文件提交地址 action地址需要和后臺(tái)servlet注解保持一致
    5.準(zhǔn)備表單元素
    6.設(shè)置表單元素的name屬性值(否則后臺(tái)無(wú)法接收數(shù)據(jù))
-->
<form method="post" enctype="multipart/form-data" action="upLoadServlet">
    姓名:<input type="text" name="uname"><br>
    文件:<input type="file" name="myfile"><br>
    <!--button默認(rèn)時(shí)提交類型 type="submit"-->
    <button>提交</button>
</form>

</body>
</html>

后臺(tái)實(shí)現(xiàn)

? 使用注解 @MultipartConfig 將一個(gè) Servlet 標(biāo)識(shí)為支持文件上傳。 Servlet 將 multipart/form-data 的 POST 請(qǐng)求封裝成 Part,通過(guò) Part 對(duì)上傳的文件進(jìn)行操作。

package formServlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.MultipartConfig;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.Part;

import java.io.IOException;

/*
* 文件上傳
* 1.使用注解@MultipartConfig,將servlet標(biāo)識(shí)為支持文件上傳
* 2.servlet將muitipart/form-data的POST請(qǐng)求封裝成part對(duì)象,通過(guò)part對(duì)文件上傳進(jìn)行操作
*
*/
@WebServlet("/upLoadServlet")
@MultipartConfig  //文件上傳注解
public class UploadServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("文件上傳");
        //設(shè)置請(qǐng)求編碼格式
        req.setCharacterEncoding("UTF-8");
        //獲取普通表單元素
        String uname=req.getParameter("uname");
        System.out.println("uname:"+uname);
        //獲取part對(duì)象
        Part part=req.getPart("myfile");
        //通過(guò)part對(duì)象獲得上傳文件名
        String fileName = part.getSubmittedFileName();
        System.out.println("file:"+fileName);
        //得到文件存放路徑
        String filePath = req.getServletContext().getRealPath("/");
        System.out.println("filePath:"+filePath);
        //上傳文件到指定路徑
        part.write(filePath+"/"+fileName);
    }
}

提交表單后查看控制臺(tái)打印結(jié)果

文件上傳
uname:張三
file:exception.jpg
filePath:E:\bdqn\JavaWeb\servlet\out\artifacts\servlet_war_exploded\

文件下載

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

資源準(zhǔn)備

在web目錄下新建文件夾存放下載資源,通過(guò)tomcat配置添加Deployment到服務(wù)器中

超鏈接下載

? 當(dāng)我們?cè)?HTML 或 JSP 頁(yè)面中使用a標(biāo)簽時(shí),原意是希望能夠進(jìn)行跳轉(zhuǎn),但當(dāng)超鏈接遇到瀏覽器不識(shí)別的資源時(shí)會(huì)自動(dòng)下載;當(dāng)遇見瀏覽器能夠直接顯示的資源,瀏覽器就會(huì)默認(rèn)顯示出來(lái),比如 txt、png、jpg 等。當(dāng)然我們也可以通過(guò) download 屬性規(guī)定瀏覽器進(jìn)行下載。但有些瀏覽器并不支持。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>文件下載</title>
</head>
<body>
<!--
超鏈接下載
        1.當(dāng)時(shí)用超鏈接(a標(biāo)簽)時(shí),如果遇到瀏覽器能夠識(shí)別的內(nèi)容,會(huì)顯示內(nèi)容,而不會(huì)進(jìn)行下載.
         指定download屬性進(jìn)行下載;

        2.如果遇到瀏覽器不能識(shí)別的內(nèi)容,會(huì)進(jìn)行下載
-->
<!--瀏覽器能夠識(shí)別的資源,顯示內(nèi)容-->
<a href="download/1.txt">文本文件</a>
<a href="download/retrun.jpg">圖片文件</a>
<!--壓縮文件是瀏覽器不能識(shí)別的資源,進(jìn)行下載-->
<a href="download/1.zip">壓縮文件</a>
<!--瀏覽器能夠識(shí)別的資源,設(shè)置download屬性,進(jìn)行下載-->
<!--download="文件名.后綴名",不設(shè)置文件名和后綴名會(huì)默認(rèn)服務(wù)器中的文件屬性-->
<a href="download/1.txt" download>文本文件下載</a>
<a href="download/retrun.jpg" download="re.png">圖片文件下載</a>

</body>
</html>

? download 屬性可以不寫任何信息,會(huì)自動(dòng)使用默認(rèn)文件名。如果設(shè)置了download屬性的值,則使用設(shè)置的值做為文件名。當(dāng)用戶打開瀏覽器點(diǎn)擊鏈接的時(shí)候就會(huì)直接下載文件。

后臺(tái)實(shí)現(xiàn)下載

實(shí)現(xiàn)步驟

  1. 需要通過(guò) response.setContentType 方法設(shè)置 Content-type 頭字段的值, 為瀏覽器無(wú)法使用某種方式或激活某個(gè)程序來(lái)處理的 MIME 類型,例 如 “application/octet-stream” 或 “application/x-msdownload” 等。
  2. 需要通過(guò) response.setHeader 方法設(shè)置 Content-Disposition 頭的值 為 “attachment;filename=文件名”
  3. 讀取下載文件,調(diào)用 response.getOutputStream 方法向客戶端寫入附件內(nèi)容。
package formServlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

/**
 * 文件下載
 * 1. 需要通過(guò) response.setContentType 方法設(shè)置 Content-type 頭字段的值, 為瀏覽器無(wú)法使用某種方式或激活某個(gè)程序來(lái)處理的 MIME 類型,例 如 "application/octet-stream" 或 "application/x-msdownload" 等。
 * 2. 需要通過(guò) response.setHeader 方法設(shè)置 Content-Disposition 頭的值 為 "attachment;filename=文件名"
 * 3. 讀取下載文件,調(diào)用 response.getOutputStream 方法向客戶端寫入附件內(nèi)容。
 */
@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("文件下載...");
        //設(shè)置請(qǐng)求編碼格式
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=UTF-8");
        //獲取參數(shù)(下載文件名)
        String fileName = req.getParameter("fileName");
        System.out.println(fileName);
        //參數(shù)非空判斷 trim():去除字符串的前后空格
        if(fileName==null||"".equals(fileName.trim())){
            //參數(shù)為空,寫入瀏覽器提示
            resp.getWriter().write("請(qǐng)輸入要下載的文件名!");
            resp.getWriter().close();  //關(guān)閉流
            return; //退出當(dāng)前
        }
        //得到文件存放路徑
        String filePath=req.getServletContext().getRealPath("/download/");
        //通過(guò)路徑得到file對(duì)象
        File file = new File(filePath + fileName);
        //判斷文件對(duì)象是否存在并且是標(biāo)準(zhǔn)文件
        if(file.exists()&&file.isFile()){
            //設(shè)置響應(yīng)類型(瀏覽器無(wú)法使用某種方式或激活某個(gè)程序來(lái)處理的 MIME 類型)
            resp.setContentType("application/x-msdownload");
            //設(shè)置響應(yīng)頭
            resp.setHeader("Context-Disposition","attachment;filename="+fileName);
            //得到file文件輸入流
            FileInputStream fis = new FileInputStream(file);
            //得到字節(jié)輸出流
            ServletOutputStream sos=resp.getOutputStream();
            //定義byte數(shù)組
            byte[] bytes=new byte[1024];
            //定義長(zhǎng)度
            int len=fis.read(bytes);
            //循環(huán)輸出
            while (len!=-1){
                sos.write(bytes,0,len);
            }
            //關(guān)閉資源 先打開的后關(guān)閉
            sos.close();
            fis.close();
        }else {
            resp.getWriter().write("文件不存在,請(qǐng)重試!");
            resp.getWriter().close();
        }
    }
}

總結(jié)

到此這篇關(guān)于JavaWeb Servlet實(shí)現(xiàn)文件上傳與下載功能的文章就介紹到這了,更多相關(guān)JavaWeb Servlet文件上傳下載內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 如何更好的使用Java8中方法引用詳解

    如何更好的使用Java8中方法引用詳解

    在Java8中,我們可以直接通過(guò)方法引用來(lái)簡(jiǎn)寫lambda表達(dá)式中已經(jīng)存在的方法,這種特性就叫做方法引用(Method Reference)。下面這篇文章主要給大家介紹了關(guān)于如何更好的使用Java8中方法引用的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • Mybatis一對(duì)多延遲加載實(shí)現(xiàn)代碼解析

    Mybatis一對(duì)多延遲加載實(shí)現(xiàn)代碼解析

    這篇文章主要介紹了Mybatis一對(duì)多延遲加載實(shí)現(xiàn)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java實(shí)現(xiàn)將html字符串插入到PPT幻燈片

    Java實(shí)現(xiàn)將html字符串插入到PPT幻燈片

    Java后端代碼操作PPT幻燈片時(shí),可直接在幻燈片中繪制形狀,并在形狀中添加文本字符串內(nèi)容。本篇文章主要介紹通過(guò)java實(shí)現(xiàn)將html字符串添加到PPT幻燈片的的方法,可添加文字、圖片、視頻、音頻等。以下是具體方法和步驟。
    2021-11-11
  • Spring中實(shí)現(xiàn)的三種異步流式接口方法

    Spring中實(shí)現(xiàn)的三種異步流式接口方法

    在現(xiàn)代Web開發(fā)中,接口超時(shí)是一個(gè)常見的問(wèn)題,尤其是在處理耗時(shí)操作時(shí),傳統(tǒng)的同步接口在處理長(zhǎng)時(shí)間任務(wù)時(shí)會(huì)阻塞請(qǐng)求線程,從而影響系統(tǒng)的響應(yīng)能力,本文將詳細(xì)講解Spring中實(shí)現(xiàn)的三種異步流式接口方法,需要的朋友可以參考下
    2024-10-10
  • JavaEE賬號(hào)注冊(cè)模擬網(wǎng)站郵箱激活

    JavaEE賬號(hào)注冊(cè)模擬網(wǎng)站郵箱激活

    這篇文章主要為大家詳細(xì)介紹了JavaEE賬號(hào)注冊(cè)模擬網(wǎng)站郵箱激活,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java 如何使用JDBC連接數(shù)據(jù)庫(kù)

    Java 如何使用JDBC連接數(shù)據(jù)庫(kù)

    這篇文章主要介紹了Java 如何使用JDBC連接數(shù)據(jù)庫(kù),幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • 關(guān)于Spring?Cache?緩存攔截器(?CacheInterceptor)

    關(guān)于Spring?Cache?緩存攔截器(?CacheInterceptor)

    這篇文章主要介紹了關(guān)于Spring?Cache緩存攔截器(?CacheInterceptor),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • spring5新特性全面介紹

    spring5新特性全面介紹

    本文將全面介紹 Spring 5。我將介紹 Java SE 8 和 Java EE 7 API 的基準(zhǔn)升級(jí)、Spring 5 的新反應(yīng)式編程模型、HTTP/2 支持,以及 Spring 通過(guò) Kotlin 對(duì)函數(shù)式編程的全面支持。
    2020-10-10
  • SpringBoot中Formatter和Converter用法和區(qū)別小結(jié)

    SpringBoot中Formatter和Converter用法和區(qū)別小結(jié)

    本文主要介紹了SpringBoot中Formatter和Converter用法和區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • JavaMail發(fā)送(帶圖片和附件)和接收郵件實(shí)現(xiàn)詳解(四)

    JavaMail發(fā)送(帶圖片和附件)和接收郵件實(shí)現(xiàn)詳解(四)

    這篇文章主要為大家詳細(xì)介紹了JavaMail帶圖片和附件的發(fā)送和接收郵件實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評(píng)論

平昌县| 湘西| 清徐县| 辽宁省| 甘肃省| 望城县| 遂溪县| 三门县| 嘉祥县| 慈溪市| 荆州市| 屏边| 泰兴市| 德安县| 繁昌县| 墨竹工卡县| 婺源县| 太康县| 吐鲁番市| 宁国市| 博野县| 昌宁县| 巴南区| 绥滨县| 富川| 济源市| 平昌县| 武山县| 上高县| 辉南县| 桂平市| 宕昌县| 蒲城县| 郴州市| 苍南县| 镶黄旗| 黄骅市| 枣强县| 吴桥县| 梅河口市| 弋阳县|