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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;导入远程表选择数据…