好记性不如烂笔头13-使用HttpServletResponse实现文件下载
2015-01-30 16:56
429 查看
在JS中也可以实现文件下载,但是在JS中的链接,很容易被盗链,而且容易造成攻击。将文件下载的链接放在J***A端,能够对用户的请求进行更加多的校验,能防止一部分的盗链和攻击。
1、使用HttpServletResponse实现下载功能的实现
1.获取要下载的文件的绝对路径
2.获取要下载的文件名
3.设置content-disposition响应头控制浏览器以下载的形式打开文件
4.获取要下载的文件输入流
5.创建数据缓冲区
6.通过response对象获取OutputStream流
7.将FileInputStream流写入到buffer缓冲区
8.使用OutputStream将缓冲区的数据输出到客户端浏览器
2、使用HttpServletResponse实现下载注意事项
文件下载注意事项:编写文件下载功能时推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。
下载中文文件时,需要注意的地方就是中文文件名要使用URLEncoder.encode方法进行编码(URLEncoder.encode(fileName, "字符编码")),否则会出现文件名乱码。
response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
3、HttpServletResponse实现下载的源代码
package com.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
*通过HttpServletResponse实现简单的文件下载
*
*@author 范芳铭
*/
public class ResponseDownload extendsHttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
//1.获取要下载的文件的绝对路径
StringrealPath = this.getServletContext().getRealPath("/files/fxjh.jpg");
//2.获取要下载的文件名
StringfileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//3.设置content-disposition响应头控制浏览器以下载的形式打开文件
response.setHeader("content-disposition","attachment;filename="
+fileName);
//4.获取要下载的文件输入流
InputStreamin = new FileInputStream(realPath);
intlen = 0;
//5.创建数据缓冲区
byte[]buffer = new byte[1024];
//6.通过response对象获取OutputStream流
OutputStreamout = response.getOutputStream();
//7.将FileInputStream流写入到buffer缓冲区
while((len = in.read(buffer)) > 0) {
//8.使用OutputStream将缓冲区的数据输出到客户端浏览器
out.write(buffer,0, len);
}
in.close();
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
1、使用HttpServletResponse实现下载功能的实现
1.获取要下载的文件的绝对路径
2.获取要下载的文件名
3.设置content-disposition响应头控制浏览器以下载的形式打开文件
4.获取要下载的文件输入流
5.创建数据缓冲区
6.通过response对象获取OutputStream流
7.将FileInputStream流写入到buffer缓冲区
8.使用OutputStream将缓冲区的数据输出到客户端浏览器
2、使用HttpServletResponse实现下载注意事项
文件下载注意事项:编写文件下载功能时推荐使用OutputStream流,避免使用PrintWriter流,因为OutputStream流是字节流,可以处理任意类型的数据,而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失。
下载中文文件时,需要注意的地方就是中文文件名要使用URLEncoder.encode方法进行编码(URLEncoder.encode(fileName, "字符编码")),否则会出现文件名乱码。
response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
3、HttpServletResponse实现下载的源代码
package com.servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
/**
*通过HttpServletResponse实现简单的文件下载
*
*@author 范芳铭
*/
public class ResponseDownload extendsHttpServlet {
publicvoid doGet(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
//1.获取要下载的文件的绝对路径
StringrealPath = this.getServletContext().getRealPath("/files/fxjh.jpg");
//2.获取要下载的文件名
StringfileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
//3.设置content-disposition响应头控制浏览器以下载的形式打开文件
response.setHeader("content-disposition","attachment;filename="
+fileName);
//4.获取要下载的文件输入流
InputStreamin = new FileInputStream(realPath);
intlen = 0;
//5.创建数据缓冲区
byte[]buffer = new byte[1024];
//6.通过response对象获取OutputStream流
OutputStreamout = response.getOutputStream();
//7.将FileInputStream流写入到buffer缓冲区
while((len = in.read(buffer)) > 0) {
//8.使用OutputStream将缓冲区的数据输出到客户端浏览器
out.write(buffer,0, len);
}
in.close();
}
publicvoid doPost(HttpServletRequest request, HttpServletResponse response)
throwsServletException, IOException {
doGet(request,response);
}
}
相关文章推荐
- 好记性不如烂笔头12-使用HttpServletResponse生成验证码
- 使用HttpServletResponse提供文件下载
- 使用response处理中文乱码,实现文件下载
- 使用response实现文件下载功能
- c# 使用FtpWebRequest,FtpWebResponse ,Stream 实现获取文件列表及下载
- ASP.NET使用Response.WriteFile(filename);实现 文件下载
- 好记性不如烂笔头------使用Acra+Android-Email实现错误日志上传
- 使用response实现文件下载
- 使用response实现文件的下载
- 好记性不如烂笔头------按键灯jni使用,打包成so文件并使用
- 一个使用URLDownloadToFile实现文件下载的类
- 使用Servlet实现动态文件下载
- 移动项目开发笔记(asp.net中Response.WriteFile()实现文件下载)
- 使用.net FtpWebRequest 实现FTP常用功能 上传 下载 获取文件列表 移动 切换目录 改名
- 使用SFTP实现Linux上文件上传下载
- ASP.NET上传下载文件示例,使用webClient实现
- 在Struts的Action继承类中用response.getOutputStream()实现文件的下载时,在返回的ActionForward类时报错
- Flex与.NET互操作(五):使用FileReference+HttpHandler实现文件上传/下载
- 项目开发技巧(四):使用JspSmartupload实现文件上传下载(一):JspSmart之upload组件源码及使用
- 项目开发技巧(四):使用JspSmartupload实现文件上传下载(三):jspsmartupload samples