我的用于下载的源码,共享给大家!

chendzcs 2004-09-05 10:11:47
看到很多人都在问一个同样的问题:如何解决“中文文件名”下载?这也是困扰本人很久的问题。
经过“搜搜搜搜搜搜........”,并经过调试通过,现将我的源码共享给大家,以免新手走弯路,
下面的代码可以解决以下问题:
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();
%>

...全文
206 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
chendzcs 2004-09-07
  • 打赏
  • 举报
回复

public String getStr(String s) throws Exception {
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();
}
// 下载文件 文件名必须是全路径
public int GetDownLoadFile(HttpServletResponse response,String filename) throws Exception {

java.io.File AbsF=new File(filename);
String FileName=AbsF.getName();
PrintWriter out = response.getWriter();

response.reset(); //这行很重要!!!!!!!!
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition","attachment; filename=\"" + getStr(FileName) + "\"");
java.io.FileInputStream fileInputStream=null;
fileInputStream = new java.io.FileInputStream(AbsF.getAbsolutePath());
if (AbsF.exists()){
int i;
while ((i=fileInputStream.read()) != -1) {
out.write(i);
}
fileInputStream.close();
out.close();
fileInputStream.close();
}
return 1;
}
chendzcs 2004-09-06
  • 打赏
  • 举报
回复
再完善一下,可以实现相对路径或绝对路径下载:
<%@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");
}
String FileName=getServletContext().getRealPath("" + filename);
java.io.File realF=new File(FileName);
java.io.File AbsF=new File(filename);
FileName=realF.getName();
int flag=0;
response.reset(); //这行很重要!!!!!!!!
request.setCharacterEncoding("gb2312");
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition","attachment; filename=\"" + getStr(FileName) + "\"");
java.io.FileInputStream fileInputStream=null;
// 打开指定文件的流信息
if (AbsF.exists()){
fileInputStream = new java.io.FileInputStream(AbsF.getAbsolutePath());
flag=1;
}else
if (realF.exists()){
fileInputStream = new java.io.FileInputStream(getServletContext().getRealPath("" + filename));
flag=1;
}
// 写出流信息
if (flag==1){
int i;
while ((i=fileInputStream.read()) != -1) {
out.write(i);
}
fileInputStream.close();
out.close();
fileInputStream.close();
}else
throw new IllegalArgumentException("找不到文件:<"+filename+">");
%>
skymark126 2004-09-06
  • 打赏
  • 举报
回复
谢谢楼主!!!
zhaogaojian 2004-09-06
  • 打赏
  • 举报
回复
收了
CNetol 2004-09-06
  • 打赏
  • 举报
回复
up
woxiangwalkman 2004-09-06
  • 打赏
  • 举报
回复
不错,思路就是这样
cocohui 2004-09-06
  • 打赏
  • 举报
回复
我要分啊。
52800195 2004-09-06
  • 打赏
  • 举报
回复
我收了~!

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧