java web 實現簡單下載功能

java web 實現簡單下載功能

項目結構


├── src\
│   ├── a.txt
│   └── com\
│       └── demo\
│           └── web\
│               ├── Cookie\
│               ├── download\
│               ├── homework\
│               ├── servlet\
│               ├── servletcontext\
│               └── utils\
└── web\├── WEB-INF\│   ├── b.txt│   └── lib\│       └── javax.servlet.jar├── c.txt├── download.html├── htmls\│   └── location2.html├── img\│   ├── 1.avi│   ├── 2.jpg│   └── 九尾.jpg├── index.jsp├── location.html└── register.html

/**
工具類
*/
import sun.misc.BASE64Encoder;import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;public class DownLoadUtils {public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {if (agent.contains("MSIE")) {// IE瀏覽器filename = URLEncoder.encode(filename, "utf-8");filename = filename.replace("+", " ");} else if (agent.contains("Firefox")) {// 火狐瀏覽器BASE64Encoder base64Encoder = new BASE64Encoder();filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";} else {// 其它瀏覽器filename = URLEncoder.encode(filename, "utf-8");}return filename;}
}/**
下載文件servlet實現
*/import com.demo.web.utils.DownLoadUtils;import javax.servlet.ServletContext;
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;@WebServlet("/downloadServlet")
public class DownloadServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//        request.setCharacterEncoding("UTF-8");//1、獲取文件名稱String filename = request.getParameter("filename");System.out.println(filename);//2、使用字節輸入流讀取數據到內存//2.1 獲取文件在服務器端的真實路徑ServletContext servletContext = this.getServletContext();String realPath = servletContext.getRealPath("/img/" + filename);//2.2 讀取文件到內存File file = new File(realPath);FileInputStream fis = new FileInputStream(file);//3、指定response響應頭信息//3.1 指定響應頭類型:content-typeString mimeType = servletContext.getMimeType(realPath);//image/jpegresponse.setHeader("content-type", mimeType);//處理文件名中文亂碼問題//1、獲取客戶端使用的瀏覽器類型String agent = request.getHeader("user-agent");//2、調用工具類,返回一個文件名稱filename = DownLoadUtils.getFileName(agent, filename);//3.2 指定響應頭的打開方式response.setHeader("content-disposition", "attachment;filename=" + filename);//4、將數據寫出到response輸出流ServletOutputStream sos = response.getOutputStream();byte[] buff = new byte[1024 * 8];//緩沖區int len = 0;while ((len = fis.read(buff)) != -1) {sos.write(buff,0,len);}fis.close();}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}
}

前端

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>下載文件</title>
</head>
<body><a href="/img/2.jpg">圖片1</a><a href="/img/九尾.jpg">圖片2</a><hr><a href="/downloadServlet?filename=九尾.jpg">下載圖片1</a><a href="/downloadServlet?filename=2.jpg">下載圖片2</a></body>
</html>

工具類


import java.io.File;
import java.io.IOException;/*** File類的使用*/
public class FileTest {/*** 創建文件** @param filename 文件名*/public File createFile(String filename) throws IOException {//1、創建file對象File file = new File(filename);//判斷文件是否存在if (!file.exists()) {//2、調用方法創建文件file.createNewFile();}return file;}/*** 創建目錄** @param pathname*/public void createDir(String pathname) {File file = new File(pathname);if (!file.exists()) {//1、第一種方式:創建目錄,只能創一級目錄
//                 file.mkdir();//1、第二種方式:創建目錄,可以創建多級目錄file.mkdirs();}}/*** 刪除文件** @param filename 文件名*/public void delFile(String filename) {File file = new File(filename);if (file.exists()) {file.delete();System.out.println("刪除成功!");} else {System.out.println(file.getName() + "不存在!");}}/*** 遍歷文件的路徑* @param filename  文件名*/public void outFilePath(String filename) {File file = new File(filename);String path = file.getAbsolutePath();String path1 = file.getPath();System.out.println(path);System.out.println(path1);}/*** 遍歷目錄中所有的文件和目錄** @param filename 文件名*/public void listDir(String filename) {File file = new File(filename);//判斷是否是目錄if (file.isDirectory()) {//遍歷目錄File[] files = file.listFiles();
//            System.out.println("文件的個數" + files.length);//跳出的條件if (null == files || files.length == 0) {return;} else {for (File file1 : files) {if (file1.isDirectory()) {System.out.println("目錄是----" + file1.getName());//遞歸算法listDir(file1.getAbsolutePath());} else {System.out.println("文件是---" + file1.getName());}}}} else {System.out.println("文件是---" + file.getName());}}/*** 給指定的文件重命名** @param filename 文件名*/public void renameFile(String filename) {File file = new File(filename);file.renameTo(new File("g://a//aa.txt"));}public static void main(String[] args) {FileTest ft = new FileTest();ft.renameFile("g://a//a.txt");
//        ft.listDir("g://apache-tomcat-8.0.36");
//        ft.outFilePath("g://a//b//b.txt");
//        try {
//            ft.createFile("g://a.txt");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        ft.createDir("g://a//b");
//        ft.delFile("g://a.txt");}
}import java.io.*;/*** java中的I/O流*/
public class IODemo {public static void main(String[] args) throws IOException {IODemo demo = new IODemo();demo.copyFile("g://a//aa.txt","g://a//b//aa.txt");
//        demo.writeFile("g://a//a.txt");
//        demo.readFile("g://a//aa.txt");}/****    讀操作* @param filename  文件名*/public void readFile(String filename) throws IOException {/*** 第一種方式*/
//        File file = new File(filename);
//        //1、創建一個字節讀流的對象
//        FileInputStream fis = new FileInputStream(file);
//        int len = 0;//讀取的字節數
//        //2、讀文件:  文件如果讀到末尾返回為-1
//        while ((len = fis.read()) != -1) {
//            System.out.print((char)len);
//        }
//        //關閉流
//        fis.close();/*** 第二種方式*/File file = new File(filename);FileInputStream fis = new FileInputStream(file);//定義一個緩沖區byte[] buff = new byte[1024 * 8];int len = 0;//讀取的字節數while ((len = fis.read(buff)) != -1) {System.out.write(buff, 0, len);}//關閉流fis.close();}//寫操作public void writeFile(String filename) throws IOException {//1、創建一個字節輸出流對象:追加內容,需要傳入第二個參數FileOutputStream fos = new FileOutputStream(new File(filename), true);//2、寫文件String str = "--這是追加的內容!";fos.write(str.getBytes());
//        fos.write(100);//強制從緩沖區中把數據寫入到文件中fos.flush();//關閉流fos.close();}//拷貝文件:邊讀邊寫的過程public void copyFile(String srcFile, String deFile) throws IOException {//1、創建字節輸入流對象File file = new File(srcFile);FileInputStream fis = new FileInputStream(file);//2、創建字節輸出流對象File file1 = new File(deFile);FileOutputStream fos = new FileOutputStream(file1);//3、使用輸入流讀取文件到內存byte[] buff = new byte[1024 * 8];int len = 0;//讀取的字節數while ((len = fis.read(buff)) != -1) {//4、邊讀邊寫fos.write(buff,0,len);fos.flush();}//5、反向關閉流fos.close();fis.close();}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91369.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91369.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91369.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

虛幻基礎:模型穿模

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄模型穿模模型之間的阻擋是否正確設置模型是角色的組件&#xff1a;角色的組件不會與場景中其他的物體發生阻擋但可以發生重疊模型穿模 模型之間的阻擋是否正確設置 模型是角色的組件&#xff1a;角色的組件不會與場…

【Linux】linux基礎開發工具(二) 編譯器gcc/g++、動靜態庫感性認識、自動化構建-make/Makefile

文章目錄一、gcc/g介紹二、gcc編譯選項預處理編譯匯編鏈接三個細節三、動靜態庫感性認識動靜態庫的優缺點四、自動化構建-make/Makefile背景知識初步上手Makefilemakefile的推導過程makefile語法一、gcc/g介紹 我們之前介紹了編輯器vim&#xff0c;可以讓我們在linux上linux系統…

CentOS 7 上使用 Docker 安裝 Jenkins 完整教程

目錄 前言 準備工作 系統要求 檢查系統信息 更新系統 安裝Docker 第一步:卸載舊版本Docker(如果存在) 第二步:安裝必要的軟件包 第三步:添加Docker官方倉庫 第四步:安裝Docker CE 第五步:啟動Docker服務 第六步:驗證Docker安裝 第七步:配置Docker用戶權限…

30.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--公共代碼--用戶上下文會話

在前面的文章中&#xff0c;我們會看到使用ContextSession來獲取當前用戶的UserId和UserName。這篇文章我們就一起來看看如何實現ContextSession。 一、ContextSession的實現 我們在公共類庫SP.Common中創建一個名為ContextSession的類&#xff0c;用于獲取當前請求的用戶信息。…

BaseDao

#### 10.1 DAO概念> DAO&#xff1a;Data Access Object&#xff0c;數據訪問對象。 > > Java是面向對象語言&#xff0c;數據在Java中通常以對象的形式存在。一張表對應一個實體類&#xff0c;一張表的操作對應一個DAO對象&#xff01;>> 在Java操作數據庫時&a…

USRP捕獲手機/路由器數據傳輸信號波形(中)

目錄&#xff1a; USRP捕獲手機/路由器數據傳輸信號波形&#xff08;上&#xff09; USRP捕獲手機/路由器數據傳輸信號波形&#xff08;中&#xff09; USRP捕獲手機/路由器數據傳輸信號波形&#xff08;下&#xff09; 三、雙工通信信號捕獲 3.1 信號接收系統 5805e6Hz&a…

使用 Kiro AI IDE 3小時實現全棧應用Admin系統

Hello&#xff0c; 大家好&#xff0c;我是程序員海軍, 全棧開發 |AI愛好者 &#xff5c; 獨立開發。 之前我是采用Node生態開發的大模型以及MCP Server,大模型開發的生態主要是Python語言&#xff0c;為了更好的學習大模型開發&#xff0c;于是開了新坑。開始學習Python, 以及…

瀏覽器pdf、image顯示

瀏覽器地址欄 pdf data:application/pdf;base64, data:application/pdf;base64,JVBERi0xLjcKJeLjz9MKMjMgMCBvYmoKPDwv image data:image/jpeg;base64, data:image/jpeg;base64,/9j/4Q3fRXhpZgAATU0AKgAAAAgABwE

《Linux運維總結:銀河麒麟V10 SP3啟動docker容器報錯permission denied》

總結&#xff1a;整理不易&#xff0c;如果對你有幫助&#xff0c;可否點贊關注一下&#xff1f; 更多詳細內容請參考&#xff1a;Linux運維實戰總結 一、環境信息 二、背景 1、使用docker啟動一個nginx容器&#xff0c;報錯信息如下&#xff1a; docker: Error response from…

PDF源碼解析

PDF源碼解析打開PDF解析PDF?0. 文件頭關鍵信息解析技術原理圖解文件頭的重要性實際文件結構示例開發者注意事項歷史背景1. 根目錄整體結構關鍵字段解析核心概念解釋實際應用場景完整對象關系圖技術總結2. 頁面樹對象結構關鍵字段解析頁面樹工作原理技術要點總結實際應用3. 圖像…

java開閉原則 open-closed principle

基本知識 1.核心思想&#xff1a;面向抽象編程 2.基本內涵&#xff1a;對修改關閉&#xff0c;對擴展開放 3.要求&#xff1a;盡可能不修改源碼而是增加新功能 例子 以spring5核心原理與30個類手寫實戰中的為例 package com.gupaoedu.vip.design.principle.openclose;/*** Crea…

擁抱智慧物流時代:數字孿生技術的應用與前景

概述 在數字經濟全面推進的當下&#xff0c;物流行業正經歷著前所未有的智能化升級。作為新一代信息技術的重要代表&#xff0c;數字孿生技術正悄然改變著物流的運作方式和決策模式。所謂數字孿生&#xff0c;是指在虛擬空間中創建與現實物流系統高度一致的數字模型&#xff0…

libnest2d-頭文件分析-libnest2d.hpp-幾何類型-策略類型-參數配置

libnest2d 庫的主頭文件&#xff0c;定義了一個用于 二維不規則形狀自動排樣&#xff08;Nesting&#xff09; 的C接口。以下是詳細解析&#xff1a;1. 頭文件結構 (1) 防止重復包含 #ifndef LIBNEST2D_HPP #define LIBNEST2D_HPP // ... #endif // LIBNEST2D_HPP確保頭文件只被…

【Docker】部署Docker可視化管理面板Dpanel

一、DPanel 介紹 1.1 DPanel 簡介 DPanel 是一款專為 Docker 設計的可視化管理面板&#xff0c;旨在降低容器、鏡像及相關資源的管理門檻。通過簡潔直觀的圖形化界面&#xff0c;即使是對 Docker 不熟悉的用戶&#xff0c;也能輕松上手&#xff0c;實現容器化應用的高效部署與管…

GCC/G++ + Makefile/make 使用

一、gcc\g編譯器 什么是gcc和g&#xff0c;它們的區別又是什么&#xff1f; gcc編譯器是專門用來編譯C語言的&#xff0c;而g編譯器既可以編譯C語言又可以用來編譯C&#xff0c;但是主要還是用來編譯C。 我們都知道代碼形成可執行程序都是需要經過預處理、編譯、匯編和鏈接這四…

重復文件查找工具:DataSecurity Plus 全面提升企業文件管理效率

企業日常運營經常會出現這樣的場景&#xff1a;員工在文件傳輸、共享與備份過程中&#xff0c;因操作不當或系統設置問題&#xff0c;出現文件重復存儲&#xff1b;跨部門協作時&#xff0c;相同的項目資料可能被多次保存&#xff1b;隨著數據遷移與系統升級&#xff0c;重復文…

【軟件架構】資源池架構設計中的三種主流模式

在資源池架構設計中&#xff0c;三種主流模式——集中式、分布式和混合式資源池——各有其獨特的優勢、劣勢和適用場景。理解它們的區別對于設計高效、可靠和可擴展的系統至關重要。 下面是對這三種模式的詳細分析和比較&#xff1a;集中式資源池 核心概念&#xff1a; 將所有計…

Java 類加載沖突

在某次線上部署過程中&#xff0c;我們遇到了一個十分詭異的問題&#xff1a;同樣的應用&#xff0c;在 ext3 文件系統下運行正常&#xff0c;但部署到 ext4 文件系統下卻出現了如下異常&#xff1a;The methods class, com.ctc.wstx.io.StreamBootstrapper, is available from…

VMware安裝 統信UOS桌面專業版

前言 近年來&#xff0c;隨著Linux發行版在開發者、企業環境中的應用逐漸增多&#xff0c;國產操作系統統信UOS&#xff08;基于Debian&#xff09;因其良好的圖形化界面和本地化支持&#xff0c;成為不少用戶體驗Linux生態的選擇之一。本文將以VMware Workstation Pro 17為例…

SAP Datasphere 02 - 建模

創建連接創建到 HANA Cloud 實例的連接查看 HANA Cloud實例連接 Endpoint創建連接選擇連接類型配置連接信息&#xff0c;授權方式&#xff0c;用戶名密碼等配置連接名稱驗證連接導入數據源表創建目錄 Hotel &#xff0c;放置建模對象點擊新建目錄&#xff0c;導入遠程表選擇數據…