• 说明: 本次的任务是将等待下载的文件放在非Web目录下(在web.xml中配置),使客户端无法直接访问待下载 文件。然后通过一个servlet进行中转,如果带下载的文件存在,通过FileInputStream对象打开这个文件,并且通过ServletOutputStream对象将待下载的文件按字节流的方式输出到客户端。若果待下载的文件是jpg,则直接在浏览器显示该图片,还有一个功能就是列出web.xml目录下指定目录中的所有文件。只需要直接单击文件就可下载或者显示图片、
  • 代码 : 
import java.io.*;
import java.text.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.net.*;
public class Download extends HttpServlet
{public void downLoad(File file,HttpServletResponse response)throws IOException{if(file.exists()){if(file.getName().length()-file.getName().lastIndexOf(".jpg")==4){response.setContentType("image/jpeg");response.addHeader("Content-Disposition","filename="+URLEncoder.encode(file.getName(),"UTF-8"));}else{response.setContentType("application/octet-stream");response.addHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(file.getName(),"UTF-8"));}response.addHeader("Content-Length",String.valueOf(file.length()));InputStream in=new FileInputStream(file);byte[] b=new byte[8192];int count=0;ServletOutputStream out=response.getOutputStream();while((count=in.read(b))>0){out.write(b,0,count);}in.close();out.close();}}private void listDir(File dir,HttpServletResponse response)throws IOException{response.setContentType("text/html;charset=UTF-8");PrintWriter out=response.getWriter();for(File file:dir.listFiles()){if(file.isFile()){out.print("<a href='Download?filename="+URLEncoder.encode(file.getName(),"UTF-8")+"'>");out.println(file.getName()+"</a><br />");}}}public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException ,IOException{response.setContentType("text/html;charset=UTF-8");String path=this.getServletConfig().getInitParameter("path");String filename=request.getParameter("filename");File dir=new File(path);if(dir.exists()){if(filename!=null){filename=dir.getPath()+File.separator+filename;System.out.println(filename);File downLoadFile=new File(filename);downLoad(downLoadFile,response);}else{listDir(dir,response);}}PrintWriter out=response.getWriter();SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");out.println(dateFormat.format(new java.util.Date()));}}//总结//在下载文件时 必须设置 Content-Type和Content-Disposition 字段 其中Content-Type字段的值是application/octet-stream表示下载二进制文件
//Content-Disposition 的值为attachment;filename= 其中attachment表示下载的是附件 浏览器会弹出一个下载对话框 如果不设置 要下载的文件将在
//浏览器打开//
  • 由于是初学servlet,这个小程序是通过记事本写的。目的是为了了解servlet的配置过程,以更好的理解servlet。
这里介绍下方法:
  1. 在<Tomcat 安装目录>\webapps目录下新建一个mydemo目录
  2. 在<Tomcat 安装目录>\webapps\mydemo目录下新建一个WEB-INF目录
  3. 在<Tomcat 安装目录>\webapps\mydemo\WEB-INF目录下新建一个classes目录
  4. 在<Tomcat 安装目录>\webapps\mydemo\WEB-INF目录中建立一个servlet类 DownLoad.java
  5. 编译 DownLoad.java javac -classpath .; servlet-api.jar -d WEB-INF\classes DownLoad.java 其中servlet-api.jar是servlet所依赖的一个库 在<Tomcat 安装目录>\lib下可以找到
  6. 配置servlet 在<Tomcat 安装目录>\WEB-INF目录下新建一个web.xml文件
    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0"metadata-complete="true"><servlet><servlet-name>Download</servlet-name><servlet-class>Download</servlet-class><init-param><param-name>path</param-name><param-value>C:\Users\min\Documents</param-value></init-param></servlet><servlet-mapping><servlet-name>Download</servlet-name><url-pattern>/Download</url-pattern></servlet-mapping>
    </web-app>
    
  7. 之后打开tomcat服务 就可以通过http://localhost:8080/mydemo/Download访问啦。

JavaWeb之Servlet学习-----实现文件动态下载功能 手写servlet 手动构建web程序相关推荐

  1. Servlet上传文件和下载文件示例

    Java Web应用程序中的文件上载和下载以及常见任务. 由于最近我写了很多有关Java servlet的文章 ,因此我想提供一个使用servlet上传和下载文件的示例示例. 用例 我们的用例是提供一 ...

  2. 关于使用DataGrid的ButtonColumn,动态添加DataGrid列,实现不定列n个文件的下载功能...

    一.使用DataGrid的ButtonColumn,动态添加DataGrid列,实现不定列n个文件的下载功能 在aspx页面中的代码如下: <asp:datagrid id="User ...

  3. python django下载 功能如何实现_Python中django文件传输下载功能的实现

    Python中django文件传输下载功能的实现,基于Django建立的网站,如果提供文件下载功能,最简单的方式莫过于将静态文件交给Nginx等处理,但有些时候,由于网站本身逻辑,需要通过Django ...

  4. 关于文件导出(下载)功能不兼容IE浏览器的解决方案

    关于文件导出(下载)功能不兼容IE浏览器的解决方案 参考文章: (1)关于文件导出(下载)功能不兼容IE浏览器的解决方案 (2)https://www.cnblogs.com/padaleidelei ...

  5. Java如何实现文件打包下载功能

        在日常项目开发中,我们会经常遇到,上传下载以及打包的常用功能,本节中就如何利用JAva自带的类库,实现zip压缩打包文件下载进行详细说明.注:不支持中文文件名,可在上传时就重命名文件名称.(下 ...

  6. lua学习第一课:下载安装(适合windows)、简单程序编译和学习网站推荐

    Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,优点很多.网上看到了一些良莠不齐的教程,现在自己来总结一番. 下载安装     下面介绍其中一种方法,步骤并不复杂,不需要任何环境 ...

  7. 使用u-boot的USB下载功能烧写程序到Nand Flash ——韦东山嵌入式Linux学习笔记06

    本文实验环境: 1. windows 7(64bit) 2. JZ2440(V2) 假设板子的Nor Flash上已经烧好了u-boot,如果我想利用u-boot的USB下载功能,把一个裸板程序烧写到 ...

  8. 深度学习笔记:07神经网络之手写数字识别的经典实现

    神经网络之手写数字识别的经典实现 上一节完成了简单神经网络代码的实现,下面我们将进行最终的实现:输入一张手写图片后,网络输出该图片对应的数字.由于网络需要用0-9一共十个数字中挑选出一个,所以我们的网 ...

  9. 深度学习面试题12:LeNet(手写数字识别)

    目录 神经网络的卷积.池化.拉伸 LeNet网络结构 LeNet在MNIST数据集上应用 参考资料 LeNet是卷积神经网络的祖师爷LeCun在1998年提出,用于解决手写数字识别的视觉任务.自那时起 ...

最新文章

  1. 20强名单公布!2021 OceanBase 数据库大赛决赛酣战在即!
  2. 微软统一预训练语言模型UniLM 2.0解读
  3. iphone安装Deb文件
  4. [转]简单介绍如何用Reporting Service制作报表
  5. 《我和他的结婚录像和相册集》的快速传播
  6. html之文档的头部和元数据定义(上)
  7. 2.4一元多项式的表示及相加,含cpp算法
  8. python回到首行_python读取文件首行和最后一行
  9. 查看局域网内的所有IP地址
  10. C语言 —— 合并两个有序数组
  11. 1000以内完数c语言程序_求1000以内完数 c语言 。。
  12. 适合公司年会的4个热门互动小游戏
  13. spss导入数据 error:对于当前服务器语言环境而言,文本过长
  14. c++ primer plus 第十四章 C++中的代码重用
  15. 相机标定中的四个坐标系
  16. 计算机组成原理——中央处理器-异常和中断机制(课程笔记)
  17. android tv box ---- 插入u盘直接播放指定文件夹中的视频
  18. html多张图片合在一块,多张照片怎么拼在一起?10张以上多图拼图方法 超简单! (全文)...
  19. 根据NSDate得到农历的年份(包括生肖) 、月、日。
  20. 利用天翎知识文档+群晖NAS搭建企业知识库,享用智能检索

热门文章

  1. 使用LogKit进行日志操作
  2. Android编译系统中的Kconfig,Makefile,.config编译系统浅析
  3. 小猿圈html5教程之canvas绘制线段方法
  4. hyperledge工具-configtxgen
  5. 工作总结20190121
  6. 在linux命令下如何访问一个url?
  7. 基于shiro的改造集成真正支持restful请求
  8. Spring基于Java的JSR-250注解
  9. SQL Server中的锁的简单学习
  10. JAVA获取当前系统时间System.currentTimeMillis()