用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”)
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值