用HttpServletResopnse 下载文件 和遇到的异常method GET is not supported by this URL 要下载的文件名包含中文以及不同浏览器接收到中文的解决办法

实现下载功能的步骤

在前端页面的链接出写get类型的url
<a href="servlet?filename=文件名"/>

在后端的servlet获得url中的文件名,并获得其真实的路径
String filename=request.getParameter(“filename”);
String path=getServletContext().getRealPath(“file”+filename);
file是存放在WebRoot下的文件夹的名字

通过输出流和读入流读实现数据的写出
InputStream is=new FileInputStream(path);
OutputStream os=response.getOutputStream();
int len=0;
byte[]buffer=new byte[1024];
while((len=is.read(buffer)!=-1){
os.write(buffer,0,len);
}
关闭流
is.close()
os.close()

如果需要文件通过下载传递给用户则需要设置头
response.setHeader(“Context-Disposition”,”attachment;filename=”+filename);

报错method GET is not supported by this URL

因为在重写doGet方法的时候没有删除
super.doGet(req, resp);
导致一致出现method GET is not supported by this URL
错误!

处理要下的文件中包含中文字符

当在后端获取到filename时需要将tomcat处理过的filename还原,然后用utf-8重新编码

filename=new string(filename.getbyte(“ISO8859-1”),”utf-8”);

因为处理过后的中文字符虽然可以正常显示在浏览器,但是实际上浏览器并不能正真的完全解析中文字符。所以就需要再将数据重新编码一次

根据不同的浏览器选则不同的编码方式

首先要获取到请求头中的User-Agent的值

String usercilent=request.getHeader(“User-Agent”);

再根据浏览器的不同判断要使用要那种编码方式
因为现在常用的浏览器中只有火狐(firefox)用的是,其他的都用的URLEncoder编码,所以只需要判断是不是火狐浏览器就可以了

需要哦先创建一个类,类名最好为DownLoadUtil,然后插入
public static String base64EncodeFileName(String dileName){
BASE64Encoder base64Encoder=new BASE64Encoder();
try{
return “=UTF-8?B?”
+new String(base64Encoder.encode(fileName.getBytes(“UTF-8”)))+”?=”;
}catch(UnsupportedEncodingExeception e){
e.printStackTrace();
throw new RuntimeException(e);
}
}

再在servlet中插入一段判断函数

if(usercilent.constint(“Firefox”)){
filename=DownLoadUtil.base64EncodeFileName(filename);
}else{

filename=URLEncoder.encode(filename,”UTF-8”)
}

猜你喜欢

转载自blog.csdn.net/qq_42799000/article/details/82227739