Sevlert 下载文件完整源码

最新在做项目时,遇到这样的一个问题,前端调用servlet 时中文乱码,并且下载下来中文文件名为“--”,后来查询相关资料,完美解决,现贴上代码,给自己做个日记,方便以后查阅!源码如下:

package com.test;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

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

import org.springframework.util.StringUtils;


/**
 * @author lt
 *  文件下载类
 */
public class FileDownloadServlet extends HttpServlet{
	private static final long serialVersionUID = 1L;
	private static final String CONTENT_TYPE = "text/html; charset=UTF-8";   
    public FileDownloadServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		request.setCharacterEncoding("UTF-8");
		doPost(request,response);
	}
	

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		request.setCharacterEncoding("UTF-8");
		
		response.setContentType(CONTENT_TYPE);
              //得到下载文件的名字
		String filename= request.getParameter("filename");
		
		if (filename==null || filename.equals("")) {
		} else {
	        
	        //设置临时文件存储位置
	     	String base = "c:/upload/";
	        
	        //创建file对象
	        File file=new File(base+filename);
	        
	        response.setContentType("application/x-msdownload");
	        //解决中文乱码
	        response.addHeader("Content-Disposition","attachment;filename="+encodingFileName(filename));
	        
	        //写明要下载的文件的大小
	        response.setContentLength((int)file.length());
	        response.addHeader("content-length", Long.toString(file.length()));  

	        //读出文件到i/o流
	        FileInputStream fis=new FileInputStream(file);
	        BufferedInputStream buff=new BufferedInputStream(fis);

	        byte [] b=new byte[1024];//相当于我们的缓存

	        long k=0;//该值用于计算当前实际下载了多少字节

	        //从response对象中得到输出流,准备下载

	        OutputStream out=response.getOutputStream();

	        //开始循环下载

	        while(k<file.length()){

	            int j=buff.read(b,0,1024);
	            k+=j;

	            //将b中的数据写到客户端的内存
	            out.write(b,0,j);

	        }

	        //将写入到客户端的内存的数据,刷新到磁盘
	        out.flush();
		}
      
	}
	
	  
	public static String encodingFileName(String fileName) { 
	        String returnFileName = ""; 
	        try { 
	            returnFileName = URLEncoder.encode(fileName, "UTF-8"); 
	            returnFileName = StringUtils.replace(returnFileName, "+", "%20"); 
	            if (returnFileName.length() > 150) { 
	                returnFileName = new String(fileName.getBytes("GB2312"), "ISO8859-1"); 
	                returnFileName = StringUtils.replace(returnFileName, " ", "%20"); 
	            } 
	        } catch (UnsupportedEncodingException e) { 
	            e.printStackTrace(); 
	           
	        } 
	        return returnFileName; 
	    } 

}

 前端js,直接传递中文文件名,传不过去,不知道什么原因,但是如果传递的是数字,可以传递过去

cell.innerHTML = '<a href="javascript:void(0);" onClick="downLoadFile(this)">'+fjInfo.FILE_NAME+'</a>';

 所以想了一个这种的办法,传递this

function downLoadFile(obj){
	var fileName=obj.innerHTML;
	fileName= encodeURIComponent(fileName);
	location.href='FileDownloadServlet.htm?filename='+fileName;
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值