Servlet实现文件下载和乱码问题

超链接方式下载

有很多文件要下载,不知道怎样为每个文件的下载编写代码。

通过<a href="downloadServlet?filename=abc.txt">abc.txt</a>的方式,传入filename参数,在servlet中通过request.getParameter(filename)来获取它的值。


链接中植入文件名作为参数

通过jsp或者模版语言的语法进行设定。比如用velocity模版:

<a href="downloadServlet?filename=${file.getName()}">下载</a>


文件保存时中文名文件不显示中文

中文文件无法访问

这两种情况的原因,都是因为HTTP协议默认使用ISO-8859-1编码,那么文件名在传递的过程中就变成了这种编码。所以要转回来。

String filename=URLDecoder.decode(URLEncoder.encode(request.getParameter("filename"),"ISO-8859-1"),"UTF-8");
response.setHeader("Content-Disposition", "attachment;filename=\""+new String(filename.getBytes(), "ISO-8859-1")+"\"");


文件只能查看不能下载

要在定响应头信息中设定内容类型:

response.setContentType("application/octet-stream");


贴一段我东拼西凑+自己修改后能运行的DownloadServlet代码,其中Eclipse工程是用UTF-8编码格式的:

package com.velocity.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLDecoder;
import java.net.URLEncoder;

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

@SuppressWarnings("serial")
public class DownloadServlet extends HttpServlet{

	private static final String UPLOAD="upload\\";
    
	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response)
	    	throws ServletException, IOException{
		doGet(request, response);
	}
	
	
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
    	throws ServletException, IOException{
    	//设定编码
		//response.setCharacterEncoding("UTF-8");
		
		//返回
		String realpath=this.getServletContext().getRealPath("/");
	    String uploadpath=realpath+UPLOAD;
	    System.out.println("uploadpath:"+uploadpath);
	        
		String filename=URLDecoder.decode(URLEncoder.encode(request.getParameter("filename"),"ISO-8859-1"),"UTF-8").trim();
		System.out.println("filename:"+filename);
		String finalname=uploadpath+filename;
		File file=new File(finalname);
		if(file.exists()){
			//设置相应信息
			response.setContentType("application/octet-stream");
			//设定头信息
			response.setHeader("Content-Disposition", "attachment;filename=\""+new String(filename.getBytes(), "ISO-8859-1")+"\"");
			InputStream inputStream=new FileInputStream(file);
			ServletOutputStream outputStream = response.getOutputStream();
			byte b[]=new byte[1024];
			int n;
			while((n=inputStream.read(b))!=-1){
				outputStream.write(b, 0, n);
			}
			//关闭流、释放资源
			outputStream.close();
			inputStream.close();
		}else{
			request.setAttribute("errorResult", "文件不存在");
			RequestDispatcher dispatcher=request.getRequestDispatcher("error.html");
			dispatcher.forward(request, response);
		}
    }
}


你可能感兴趣的:(Servlet实现文件下载和乱码问题)