filedownload
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<!--可以配置一些Listener 或 Filter 来观察一些对象的生命周期 -->
<servlet>
<servlet-name>download_servlet</servlet-name>
<servlet-class>edu.shao.webapp.sample.DownloadServlet</servlet-class>
<init-param>
<param-name>fileRoot</param-name>
<param-value>d:/</param-value>
</init-param>
<init-param>
<param-name>contentType</param-name>
<param-value>application/octet-stream</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>download_servlet</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
</web-app>
package edu.shao.webapp.sample;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class DownloadServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
public static Logger logger=LogManager.getLogger(DownloadServlet.class);
private String contentType;
private String enc="UTF-8";
private String fileRoot;
@Override
public void init(ServletConfig config) throws ServletException {
contentType = config.getInitParameter("contentType");
fileRoot = config.getInitParameter("fileRoot");
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
logger.debug("Do Get Method.");
String fileName=req.getParameter("fileName");
String filePath=fileRoot+File.separator+fileName;
File downloadFile=new File(filePath);
if (downloadFile.exists()) {
logger.info("File exist");
resp.setContentType(contentType);
Long length=downloadFile.length();
resp.setContentLength(length.intValue());
fileName = URLEncoder.encode(downloadFile.getName(), enc);
resp.addHeader("Content-Disposition", "attachment; filename=" + fileName);
ServletOutputStream servletOutputStream=resp.getOutputStream();
FileInputStream fileInputStream=new FileInputStream(downloadFile);
BufferedInputStream bufferedInputStream=new BufferedInputStream(fileInputStream);
int size=0;
byte[] b=new byte[4096];
while ((size=bufferedInputStream.read(b))!=-1) {
logger.info("write to output stream..");
servletOutputStream.write(b, 0, size);
}
servletOutputStream.flush();
servletOutputStream.close();
bufferedInputStream.close();
}else {
logger.info("File is not exist");
}
}
}
解释:
1、contentType用于定义用户的浏览器如何显示将要加载的数据,或者如何处理将要加载的数据。如网页的contentType是text/html,jpeg图片的contentType是image/jpeg。如果不知道文件类型,可以设置为二进制流文件 application/octet-stream
2、contentType和fileRoot(待下载文件的目录)通过web.xml配置。
3、resp.setContentType()、resp.setContentLength()、resp.addHeader("Content-Disposition", "attachment; filename=" + fileName); 三个调用设置一些必要的响应报头(reponse header)。
filedownload的更多相关文章
- jquery.fileDownload plugin: Success msg alert before actual pdf download completed
Currently , I use jquery fileDownload plugin to download multiple pdf that in a list page, which eve ...
- Kettle Rest大文件上传(RestUploadFile.ktr) Rest文件下载(FileDownload.ktr)
1. Rest大文件上传(RestUploadFile.ktr) 需求描述 上传文件大于10M小于500M 上传文件进行分片(5M一片要比1M分片整体时间快) 先使用java类进行功能模拟在迁移Ktr ...
- org.zkoss.zul.Filedownload.java 源码
/* Filedownload.java Purpose: Description: History: Mon Apr 16 09:29:44 2007, Created by tomyeh Copy ...
- MVC FileDownLoad
public ActionResult MatDownload() { string ShopId = Session["ShopId"].ToString(); var self ...
- Pikachu-Unsafe Filedownload(不安全的文件下载)
不安全的文件下载概述 文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文 ...
- Unsafe Filedownload - Pikachu
概述: 文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后会开始执行下载代码,将该文件名对应的文件r ...
- pikachu Unsafe Filedownload 不安全的文件下载
不安全的文件下载概述文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件 ...
- Pikachu-Unsafe Filedownload模块
一.概述 文件下载功能在很多web系统上都会出现,一般我们当点击下载链接,便会向后台发送一个下载请求,一般这个请求会包含一个需要下载的文件名称,后台在收到请求后 会开始执行下载代码,将该文件名对应的文 ...
- iOS开发系列--网络开发
概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...
随机推荐
- Webpack学习笔记一:What is webpack
#,Loaders干嘛的,webpack can only process JavaScript natively, but loaders are used to transform other ...
- Jquery揭秘系列:谈谈bind,one,live,delegate事件及实现
在Jquery里面,我们用的最多的就是事件绑定了,事件绑定有多个函数.例如:bind,one,live,delegate等等. 我们先看看他们的定义,直接进入主题: bind( )方法用于将一个处理程 ...
- js版弹力球实例
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>弹 ...
- Windows Live Writer发布测试
通过Windows Live Writer发布文章测试!!!!
- php面向对象编程(二)
现在我们来了解一下面向对象的一个封装性的问题 封装性:在我的理解里面 可以理解为一个u盘 我们使用u盘的接口与电脑进行数据之间的交互 但是我们不能看到里面的结构 这个特性我们可以称为封装性 好处:利用 ...
- 深入理解图优化与g2o:g2o篇
内容提要 讲完了优化的基本知识,我们来看一下g2o的结构.本篇将讨论g2o的代码结构,并带着大家一起写一个简单的双视图bundle adjustment:从两张图像中估计相机运动和特征点位置.你可以把 ...
- Git从入门到学会
Git简介 Git是什么? Git和SVN一样都是一种高效的管理代码的系统. Git是目前世界上最先进的分布式版本控制系统(没有之一). 创建版本库 什么是版本库呢?版本库又名仓库,英文名reposi ...
- NodeJS:Error: Cannot find module 'jshint/src/cli'
以前命令:npm install gulp-jshint --save-dev 实质上是安装jshint失败,缺少该模块. 更换命令 :npm install --save-dev jshint gu ...
- VisualStudio配色方案
最近发现一个很神奇的网站,可以方便的为VisualStudio配色:Studio Styles - Visual Studio color schemes 可以下载一份自己喜欢的配色方案 如果还不满意 ...
- mysql索引
1.创建索引 (PRIMARY KEY,INDEX,UNIQUE) mysql>ALTER TABLE tbl_name ADD INDEX index_name (column list); ...