文件下载基础知识点

一、文件的下载两种方式,头信息设置

1、文件的下载
    * 什么是文件下载:从服务器上把文件保存到本地电脑上,这个过程称为文件的下载
		
    * 文件下载有两种方式:
	- 第一种方式:直接写超链接,在超链接里面写文件的路径
		*** 存在问题,如果文件是图片格式,直接打开;如果zip格式的文件,才会提示下载。
		*** 无论什么格式,都提示下载

	- 第二种方式:手动写代码实现下载
		*** 设置头信息 Content-Disposition,无论文件是什么格式,都以下载的方式打开

二、文件下载实现步骤

* 文件下载的代码实现步骤:
     第一步,从服务器上获取到要下载的文件流(输入流)
   
     第二步,使用输出流把文件写到浏览器
   
     第三步,流对接
	** 最重要的步骤:设置头信息 Content-Disposition,无论文件是什么格式,都以下载的方式打开
                //设置头信息
		    response.setHeader("Content-Disposition", "attachment;filename="+filename);
	** 设置文件的MIME类型
		//得到文件的mime类型
	            String type = getServletContext().getMimeType(filename);
	        //设置mime类型
		    response.setContentType(type);

三、下载文件存在中文解决方案

* 如果下载的文件名称包含中文,不能正常显示
	-如何解决:
		*** 不同的浏览器有不同的编码方式,ie浏览器采用url编码;火狐浏览器采用的base64编码

	- 如何判断不同的浏览器:
		*** 在请求头里面有User-Agent:获取浏览器类型
		//解决中文乱码问题
		//得到当前请求的浏览器的类型
		String agent = request.getHeader("User-Agent");
					
		//如果是火狐浏览器
			if(agent.contains("Firefox")) {
			    //url采用base64编码
			    filename = "=?UTF-8?B?"+new BASE64Encoder().encode(filename.getBytes("utf-8"))+"?=";
			} else {//ie浏览器
			    filename = URLEncoder.encode(filename, "utf-8");
			}

四、代码演示

package com.ayit.download;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Encoder;

import com.ayit.bean.Info;
import com.ayit.service.InfoService;

/**
 * 该类实现文件下载功能
 * @author XiaYuJia
 *
 */
public class Download extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
			
		//根据id查询数据库文件信息
		String id = request.getParameter("id");
		InfoService service = new InfoService();
		
		Info info = service.selectInfo(id);
		if(info==null){
			throw new RuntimeException("文件不存在");
		}else{
			//获取文件信息
			String realName = info.getRealName();
			String uuidName = info.getUuidName();
			String savePath = info.getSavePath();
			
			//对下载的文件包含中文名称进行处理
			String header = request.getHeader("User-Agent");
			//如果是火狐浏览器
			if(header.contains("Firefox")) {
				//base64编码
				realName = "=?UTF-8?B?"+
				        new BASE64Encoder().encode(realName.getBytes("utf-8"))+"?=";
			} else {//其他浏览器
				realName = URLEncoder.encode(realName,"utf-8");
			}
			
			//设置mime类型
			response.setContentType(getServletContext().getMimeType(realName));
			//设置下载头信息
			response.setHeader("Content-Disposition", "attachement;filename="+realName);
			
			//获取文件输入输出流
			InputStream in  = new FileInputStream(savePath+"/"+uuidName);
			OutputStream out = response.getOutputStream();
			int len = 0;
			byte[] b = new byte[1024];
			while((len=in.read(b))!=-1){
				out.write(b,0,len);
			}
			in.close();
		}
	}

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

}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值