javaweb实现下载

实现代码

java代码

package com.kuang.servlet;
​
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
​
public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、获取要下载的文件路径,
        String realPath ="E:\\javaweb-02-servlet\\response\\src\\main\\resources\\XXX.jpg";
        System.out.println("文件下载路径" + realPath);
        //2、需要下载的文件名是啥?
        //realPath.lastIndexOf("\\")查找“\\”最后出现的位置
        System.out.println(realPath.lastIndexOf("\\"));
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
        //3、设置想办法让浏览器支持(content—Disposition)下载我们需要的东西,中文文件名URLEnconder.encode编码,否则可能会有乱码。
        resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF-8"));
        //4、获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
        //5、创建缓冲区
        int len = 0;
        byte[] buffer =new byte[1024];
        //6、获取OutpuStrean对象
        ServletOutputStream out = resp.getOutputStream();
        // 7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端!
        while((len=in.read(buffer))>0){
            out.write(buffer,0,len);
        }
​
        in.close();
        out.close();
​
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
​

web.xml中注册:

<servlet>
 &#xA0; &#xA0;<servlet-name>fileservlet</servlet-name>
 &#xA0; &#xA0;<servlet-class>com.kuang.servlet.FileServlet</servlet-class>
</servlet>
<servlet-mapping>
 &#xA0; &#xA0;<servlet-name>fileservlet</servlet-name>
 &#xA0; &#xA0;<url-pattern>/download</url-pattern>
</servlet-mapping>

Typora快捷整理代码”shift+tab”;

代码分析

String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);

lastIndexOf(“\”)返回”\”的索引需要加1(lastIndexOf索引从1开始,substring索引从0开始),给substring( beginIndex, endIndex),获得文件名字。

  • beginIndex— 起始索引(包括), 索引从 0 开始。
  • endIndex— 结束索引(不包括)。

比如substring(4,10)表示取出从0开始数,索引4到索引10之间的字符串。

比如substring(4)表示取出从0开始数,索引4到结束的字符串。

例子:

public class RunoobTest {
 &#xA0; &#xA0;public static void main(String args[]) {
 &#xA0; &#xA0; &#xA0; &#xA0;String Str = new String("This is text");

 &#xA0; &#xA0; &#xA0; &#xA0;System.out.print("&#x8FD4;&#x56DE;&#x503C; :" );
 &#xA0; &#xA0; &#xA0; &#xA0;System.out.println(Str.substring(4) );

 &#xA0; &#xA0; &#xA0; &#xA0;System.out.print("&#x8FD4;&#x56DE;&#x503C; :" );
 &#xA0; &#xA0; &#xA0; &#xA0;System.out.println(Str.substring(4, 10) );
 &#xA0;  }
}

运行结果是:

&#x8FD4;&#x56DE;&#x503C; : is text
&#x8FD4;&#x56DE;&#x503C; : is te
lastIndexOf(String str, int fromIndex)

str:需要检索的字符串,fromIndex:索引位,lastlndexOf是反向索引。lastIndexOf(qwe,10),会返回从0到第10位最后一个qwe的索引。

lastIndexOf(String str)

str:需要检索的字符串,lastIndex(qwe),返回最后一个qwe字符串索引。

例子:

String Str = new String("&#x83DC;&#x9E1F;&#x6559;&#x7A0B;:www.runoob.com");
&#x200B;
System.out.print("&#x67E5;&#x627E;&#x5B57;&#x7B26; o &#x6700;&#x540E;&#x51FA;&#x73B0;&#x7684;&#x4F4D;&#x7F6E; :" );
System.out.println(Str.lastIndexOf( 'o' ));
&#x200B;
System.out.print("&#x4ECE;&#x7B2C;14&#x4E2A;&#x4F4D;&#x7F6E;&#x67E5;&#x627E;&#x5B57;&#x7B26; o &#x6700;&#x540E;&#x51FA;&#x73B0;&#x7684;&#x4F4D;&#x7F6E; :" );
System.out.println(Str.lastIndexOf( 'o', 14 ));

运行结果:

&#x67E5;&#x627E;&#x5B57;&#x7B26; o &#x6700;&#x540E;&#x51FA;&#x73B0;&#x7684;&#x4F4D;&#x7F6E; :17
&#x4ECE;&#x7B2C;14&#x4E2A;&#x4F4D;&#x7F6E;&#x67E5;&#x627E;&#x5B57;&#x7B26; o &#x6700;&#x540E;&#x51FA;&#x73B0;&#x7684;&#x4F4D;&#x7F6E; :13&#x3000;&#x3000;&#x3000;&#x3000;&#x3000;&#x3000;&#x3000;&#x3000;&#x3000;&#x3000;&#x3000;&#x3000;&#x3000;&#x3000;

Original: https://www.cnblogs.com/zuma999/p/16618736.html
Author: 祖玛
Title: javaweb实现下载

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609456/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 使用 Java Swing 编写 IpChat, 基于 IP Messenger 协议,支持 IPv4/IPv6

    最近一段时间居家办公,使用 Java Swing 编写 IpChat, 基于 IP Messenger 协议,支持 IPv4/IPv6。可实现简单的文本信息传输,点对点直接通讯,无…

    Java 2023年6月9日
    053
  • Spring Authorization Server授权服务器入门

    11月8日Spring官方已经强烈建议使用 Spring Authorization Server替换已经过时的Spring Security OAuth2.0,距离 Spring…

    Java 2023年5月30日
    079
  • 设计模式 19 备忘录模式

    备忘录模式(Memento Pattern)属于 行为型模式 2021 年 10 月 1 日下午,河南驻马店的一名 13 岁女中学生,因和同学发生不愉快喝下半瓶 百草枯。10 月 …

    Java 2023年6月6日
    072
  • Excel作为数据源的调用方法与数据文件说明

    感谢各位对我们规划平台的支持,对于小伙伴们提出的宝贵建议我们会收集起来,整理成改进清单。基于这个清单实现并发布对应的功能。这新发布的具有通用性的功能都会纳入我们的通用版本中。选择了…

    Java 2023年6月16日
    071
  • Gitee多分支提交被拒

    方法一首先 git log 查看commit记录, 找到远端本地冲突之前的commit git reset –soft [commitID] 1、git pull origin …

    Java 2023年6月8日
    053
  • 前后端分离,SpringBoot如何实现验证码操作

    验证码的功能是防止非法用户恶意去访问登录接口而设置的一个功能,今天我们就来看看在前后端分离的项目中,SpringBoot是如何提供服务的。 SpringBoot版本 本文基于的Sp…

    Java 2023年6月8日
    076
  • JAVA流程控制if、switch、while、do while、for、break、continue的用法及区别

    选择结构 if 选择结构 语法 if(布尔表达式) { //当布尔表达式为true将执行的语句 } if(布尔表达式) { //当布尔表达式为true将执行的语句 }else{ /…

    Java 2023年6月9日
    098
  • OptaPlanner 发展方向与问题

    ​ 最近一段时间,因为忙于【易排(EasyPlan)规划平台】的设计与开发工作,平台的一些功能设计,需要对OptaPlanner的各种特性作更深入的研究与应用。慢慢发现,OptaP…

    Java 2023年6月16日
    095
  • java将信息导入到excel文件中

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/jackge/p/4233739.htmlAuthor:…

    Java 2023年5月29日
    077
  • 数组

    数组介绍: 可以存放同一类型的数据,包括基本数据类型和引用类型 *数组也是一种数据类型,引用类型 数组的声明和创建: 动态初始化创建–> 数据类型[] 数组名 =…

    Java 2023年6月16日
    050
  • Http原理

    HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。 文本:html,字符串,~ …. 超文本:图片,音乐,视频,定位,地图…&#…

    Java 2023年6月8日
    067
  • Fiddler如何设置接口并发

    Fiddler — 并发 可以对接口测试是否做了限制,比如我进行抽奖,我将 抽奖的接口进行并发,如果开发没有做限制同一秒内我进入10个请求都被响 应,那恭喜了你有了是个奖品 1….

    Java 2023年6月6日
    073
  • Mysql中有哪些减少回表的操作?

    回表是指,InnoDB 在普通索引 a 上查到主键 id 的值后,再根据一个个主键 id 的值到主键索引上去查整行数据的过程。 使用覆盖索引 如果 select 的数据列只用从索引…

    Java 2023年6月5日
    066
  • sqlserver服务器名称改成本地IP地址登录

    在安装sqlserver2008、2012等时选择的是默认实例,服务器名称也就是电脑的名称,特别是登录本地的数据库,需要输入电脑用户名称加上SQLEXPRESS 例如:zhangs…

    Java 2023年6月5日
    081
  • 类加载器ClassLoader

    1.双亲委派模型 java是根据双亲委派模型的加载类的,当一个类加载器加载类时,会先尝试委托给父类加载器去加载,直到到达启动类加载器顶层若加载不了,则再让子类加载器去加载直到类成功…

    Java 2023年6月9日
    077
  • Converting a List to String in Java

    https://www.baeldung.com/java-list-to-string 1. Introduction In this quick tutorial, we&#8…

    Java 2023年5月29日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球