我的用于下载的源码,共享给大家!
看到很多人都在问一个同样的问题:如何解决“中文文件名”下载?这也是困扰本人很久的问题。
经过“搜搜搜搜搜搜........”,并经过调试通过,现将我的源码共享给大家,以免新手走弯路,
下面的代码可以解决以下问题:
1、对非网页文件进行“下载”,而不是由浏览器直接打开;
2、支持中文文件名的下载。
测试环境:
windows2000 专业版
Resin216
--------------------------------------
测试文件<test.jsp>:
<a href= 'mydownload.jsp?filename=测试.xls'>test</a>
--------------------------------------
下载文件<MyDownLoad.jsp>:
<%@page import="java.util.*"%>
<%@page import="java.io.*"%>
<%@page import="java.net.*"%>
<%@ page contentType="text/html;charset=gb2312"%>
<%!
//上传下载全攻略jspSmartUpload
//引用自http://www.jspcn.net/newsdetail.jsp?news_id=115
//以下是原文详注
/**
* 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名.
* 纵横软件制作中心雨亦奇2003.08.01
* @param s 原文件名
* @return 重新编码后的文件名
*/
public static String getStr(String s){
StringBuffer sb = new StringBuffer();
for (int i=0;i<s.length();i++) {
char c = s.charAt(i);
if (c >= 0 && c <= 255) {
sb.append(c);
} else {
byte[] b;
try {
b = Character.toString(c).getBytes("utf-8");
} catch (Exception ex) {
System.out.println(ex);
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0) k += 256;
sb.append("%" + Integer.toHexString(k).toUpperCase());
}
}
}
return sb.toString();
}
%>
<%
String filename = "";
if (request.getParameter("filename") != null) {
filename = request.getParameter("filename");
}
response.reset(); //这行很重要!!!!!!!!
request.setCharacterEncoding("gb2312");
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition","attachment; filename=\"" + getStr(filename) + "\"");
// 打开指定文件的流信息
java.io.FileInputStream fileInputStream = new java.io.FileInputStream(getServletContext().getRealPath("" + filename));
// 写出流信息
int i;
while ((i=fileInputStream.read()) != -1) {
out.write(i);
}
fileInputStream.close();
out.close();
%>