超链接方式下载
有很多文件要下载,不知道怎样为每个文件的下载编写代码。
通过<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);
}
}
}
本文详细介绍了如何通过超链接下载多个文件,并解决在HTTP协议下中文文件名无法正确显示的问题。通过编码和解码操作确保中文文件能够正常访问。同时,演示了如何设置正确的响应头信息使文件可以被正确下载。
1176

被折叠的 条评论
为什么被折叠?



