文件的下载_eaglezsx的博客-程序员ITS301

技术标签: 文件下载  

超链接下载

<a href="${pageContext.request.contextPath}/File/a.txt">文本文件</a>

如果文件可以直接被浏览器解析,那么会在浏览器中直接打开,不能被浏览器直接解析的,就是下载操作。直接打开的要想下载,右键另存为。

超链接下载,要求下载的资源,必须是可以直接被浏览器直接访问的。(比如我的文件没有放在当前项目下,而是放到了另一个D盘下,浏览器就访问不到我D盘下的文件)

客户端访问服务器静态资源文件时,静态资源文件是通过缺省Servlet返回的,在Tomcat配置文件conf/web.xml中的org.apache.catalina.servlets.DefaultServelt操作的

在服务器端编程完成下载

新建一个jsp,填写代码

<body>
    <a href='${pageContext.request.contextPath}/download?filename=a.txt'>txt文件</a>
    <a href='${pageContext.request.contextPath}/download?filename=a.jpg'>jpg文件</a>
    <a href='${pageContext.request.contextPath}/download?filename=a.mp3'>mp3文件</a>
</body>

新建一个Servlet,download.java

public class download extends HttpServlet {
    

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String filename=request.getParameter("filename");
        File file=new File("d:/"+filename);
        if (file.exists()) {
            FileInputStream fis=new FileInputStream(file);//读取要下载文件的内容
            OutputStream os=response.getOutputStream();//将要下载的文件内容通过输出流写回到浏览器

            int len=0;
            byte[] b=new byte[1024*1024];

            while((len=fis.read(b))!=-1){
                os.write(b,0,len);
            }
            os.close();
            fis.close();
        }

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

}

这样做之后,浏览器也可以访问不在项目下的文件了。

但还是,如果文件可以直接被浏览器解析,那么会在浏览器中直接打开,不能被浏览器直接解析的,就是下载操作。直接打开的要想下载,右键另存为。

设置一个响应头,设置后的效果,就是无论返回的是否可以被浏览器解析,都是下载。

response.setHeader("content-disposition", "attachment;filename="+filename);

文件名乱码问题

如果文件名为中文,下载的时候文件名会为空。

添加代码

String agent=request.getHeader("user-agent");
            if (agent.contains("MSIE")) {
                //IE
                filename=URLEncoder.encode(filename,"utf-8");
            }else if (agent.contains("Firefox")) {
                //火狐
                filename="=?utf-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";
            }else{
                //其他浏览器
                filename=URLEncoder.encode(filename,"utf-8");
            }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zsx157326/article/details/70225169

智能推荐

创建LabwindowsCVI工程_qq_41256212的博客-程序员ITS301_labwindows cvi

前话:以前上大学时,一直在寻找一种简单的IDE,拥有如下特点:1、集成丰富的控件(可以显示波形);2、编程语言简单(最好是C语言);3、拥有丰富的库(比如RS-232库、TCP/IP库、USB库等)。笔者曾经学过1、Visual C++开发,但发现其编程有点麻烦,还有就是控件有点简单,没有显示波形的控件(笔者当时对可以实时显示波形的工具一直比较着迷);2、LabVIEW开发,当时笔者觉得画图的...

简析利用调试寄存器实现内核函数的HOOK_iiprogram的博客-程序员ITS301

Written By: yykingking [RCT] ([email protected])本文的思路有不少前人都曾经略微提到过,我只是去实现了下罢了.  某些RK,木马会经常HOOK一些关键函数从而达到隐藏等目的,而相应的ARK检测软件也会通常会先恢复这些关键函数的HOOK(譬如利用硬盘文件恢复),然后再调用来检测RK,这样就可以检测出某些隐藏.下面就介绍利用调试器实现某些内核函数的HOO

Cannot change version of project facet Dynamic Web Module to 2.5_孤独的远行者的博客-程序员ITS301

在eclipse的工程上选择属性,再选择Project Facets里面中选择Dynamic Web Module ,将2.3修改为2.5,提示如下信息:Cannot change version of project facet Dynamic Web Module to 2.5解决方法:在工程目录下有一个.settings文件夹,打开org.eclipse.wst.comm

yum安装报错:[Errno 256] No more mirrors to try._gdb-7.2-92.el6.x86_64.rpm from base: [errno 256] n_短裤男孩的博客-程序员ITS301

问题:解决(简单快捷)1.先上传需要的rpm软件包2.根据提示的安装包版本,使用命令:yum install -y w3m-0.5.2-19.el6.x86_64.rpm3.最后安装成功其他安装包如果也是像这样不能下载安装,可以采用 yum install -y 具体版本的安装包 。...

前端 WebSocket,客户端主动连接,主动关闭_澜漾的博客-程序员ITS301_前端关闭websocket连接

&lt;!DOCTYPE html&gt;&lt;html lang="en"&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;title&gt;webSocket小Demo&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;div class="container"&gt; &lt;div&gt; &lt;input type="text" id="msg"&gt; &lt

jquery radio设置checked但按钮radio仍然没选中的js处理方式-javascript bootstrap_韭菜猫骑士的博客-程序员ITS301

今天在用jQuery设置表单radio的选中时遇到了radio 设置checked但按钮还是没选中的情况: 是否有父机构? 是 否第一次按radio切换没问题,但是当我第二次切换radio就出现两个radio都没选中的样子。(单选框只能选一个) if (object.hasFather) { $("#editModal input[type='radio

随便推点

linu修改open files无效_不越狱修改运动步数,安卓苹果手机通用_weixin_39725365的博客-程序员ITS301

生命在于运动,在当下社交软件流行的今天,衡量运动的指标是什么?当然就是运动所产生的步数了,微信运动排行需要、支付宝蚂蚁森林需要、QQ运动也需要,可是学习任务繁重、工作忙碌的我们,想在app上产生点运动步数太难了,怎么办?下面教小伙伴们手机不用越狱,安全有效的修改运动步数的方法,安卓苹果手机通用,从此,我也可以愉快的种树、刷运动排行榜了。下面就以苹果系统进行讲解,安卓操作方法基本相同,大家...

php长连接demo心跳包,websocket 以及心跳检测实现长连接_不贪吃的博客-程序员ITS301

initWebSocket () { // 初始化weosocketthis.destroyWebSocket()try {console.log('连接websocket')const wsuri = 'ws://' + this.dataM.split('/')[2] + '?pageId=' + generateUUID()// ws地址this.webSocket = new WebSoc...

You cannot run the non-logged version of bulk copy in this database. Please check with the DBO. 问题的解决方法_zwhfyy的博客-程序员ITS301

[email protected]_WEB:/sybase/OCS-12_5/bin> dbrestore*** 0+1/1 bcpout chuanpiao ***Server Message: CHQ_WEB - Msg 4806, Level 16, State 1:You cannot run the non-logged version of bulk copy in this database. P

CTP Python API及Demo(利用Swig 封装)Windows版(traderapi)_景色正好的博客-程序员ITS301

前言: 目前上期技术CTP系统提供的API版本是C++版本,本文主要介绍Windows 32位平台下利用Swig工具将CTP C++接口trader API转换为python可调用的接口。此版本是在原先版本上的升级,解决了onfrontconnected回调的宕机问题。感谢知乎网友@warlock 一起探讨。1. 准备工作从CTP官网上下载CTP API点击下载。32位的API文件

复制文件夹下的多个同名文件到新文件夹并随机重命名_「已注销」的博客-程序员ITS301_file复制文件随机生成文件名

import java.io.*;import java.util.Random;public class FileUtils { public static void main(String[] args) throws IOException { String source = &amp;amp;quot;源文件夹&amp;amp;quot;; String dest = &amp;amp;quot;目标文件夹&amp;amp;quot;; ...

Java实现Redis的哈希(Hash)命令_double_lifly的博客-程序员ITS301

配置文件请看Java实现redis  https://blog.csdn.net/qq_41934990/article/details/81612180本编文章知识简单的实现了redis 的增删改查,指令不是很全还请大家见谅package com.huadian.Hash;import com.huadian.redisUntil.JedisPoolUntil;import or...

推荐文章

热门文章

相关标签