用jAVA做的web工程中文档下载是怎么实现的
例如我已有一些文档在tomcat的temp路径下有个叫新建文档.doc的文件。怎样实现它的下载,我之前用路径拼的,结果一般的服务器都不支持中文路径。我设过tomcat中s...
例如我已有一些文档在tomcat的temp路径下有个叫新建文档.doc的文件。怎样实现它的下载,我之前用路径拼的,结果一般的服务器都不支持中文路径。我设过tomcat中server.xml中的<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443" URIEncoding="GBK"/>也不好使。并且就算英文文件的话,只有doc,zip等格式的文件一点击是下载,.rar,txt,sql等文件一点击的话不是直接把内容在页面上显示了,就是显示一堆乱码。看很多网站上都有附件,rar包的下载,都是怎样实现的,请有实际开发经验的帮帮给指导一下 展开
redirectPort="8443" URIEncoding="GBK"/>也不好使。并且就算英文文件的话,只有doc,zip等格式的文件一点击是下载,.rar,txt,sql等文件一点击的话不是直接把内容在页面上显示了,就是显示一堆乱码。看很多网站上都有附件,rar包的下载,都是怎样实现的,请有实际开发经验的帮帮给指导一下 展开
1个回答
展开全部
public static void downloadFile( String filePath, HttpServletResponse response) {
String fileName = ""; //文件名,输出到用户的下载对话框
//从文件完整路径中提取文件名,并进行编码转换,防止不能正确显示中文名
try {
if(filePath.lastIndexOf("/") > 0) {
fileName = new String(filePath.substring(filePath.lastIndexOf("/")+1, filePath.length()).getBytes("GB2312"), "ISO8859_1");
}else if(filePath.lastIndexOf("\\") > 0) {
fileName = new String(filePath.substring(filePath.lastIndexOf("\\")+1, filePath.length()).getBytes("GB2312"), "ISO8859_1");
}
}catch(Exception e) {}
//打开指定文件的流信息
FileInputStream fs = null;
try {
fs = new FileInputStream(new File(filePath));
}catch(FileNotFoundException e) {
e.printStackTrace();
return;
}
//设置响应头和保存文件名
response.reset();
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
//写出流信息
int b = 0;
try {
PrintWriter out = response.getWriter();
while((b=fs.read())!=-1) {
out.write(b);
}
fs.close();
out.close();
System.out.println("文件下载完毕.");
}catch(Exception e) {
e.printStackTrace();
System.out.println("下载文件失败!");
}
}
我随便找了个都能用,中文路径没有问题。 fileName = new String(filePath.substring(filePath.lastIndexOf("/")+1, filePath.length()).getBytes("GB2312"), "ISO8859_1"); 这个地方转码了。
String fileName = ""; //文件名,输出到用户的下载对话框
//从文件完整路径中提取文件名,并进行编码转换,防止不能正确显示中文名
try {
if(filePath.lastIndexOf("/") > 0) {
fileName = new String(filePath.substring(filePath.lastIndexOf("/")+1, filePath.length()).getBytes("GB2312"), "ISO8859_1");
}else if(filePath.lastIndexOf("\\") > 0) {
fileName = new String(filePath.substring(filePath.lastIndexOf("\\")+1, filePath.length()).getBytes("GB2312"), "ISO8859_1");
}
}catch(Exception e) {}
//打开指定文件的流信息
FileInputStream fs = null;
try {
fs = new FileInputStream(new File(filePath));
}catch(FileNotFoundException e) {
e.printStackTrace();
return;
}
//设置响应头和保存文件名
response.reset();
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
//写出流信息
int b = 0;
try {
PrintWriter out = response.getWriter();
while((b=fs.read())!=-1) {
out.write(b);
}
fs.close();
out.close();
System.out.println("文件下载完毕.");
}catch(Exception e) {
e.printStackTrace();
System.out.println("下载文件失败!");
}
}
我随便找了个都能用,中文路径没有问题。 fileName = new String(filePath.substring(filePath.lastIndexOf("/")+1, filePath.length()).getBytes("GB2312"), "ISO8859_1"); 这个地方转码了。
追问
大侠 我之前的是 private OutputRenderer doGotoUrlAction() {
String contextPath=getRequest().getContextPath();
FileSystem file=(FileSystem) FileSystemHome.getOnly().findById(id);
return new RedirectRenderer(contextPath+"/"+"tempfile/filesystem/"+file.getFile_id()+"/"+file.getFs_files_name());这种类型的,第二个参数该填啥啊?
追答
RedirectRenderer & OutputRenderer 这个是你工程里自己包装的吧? 这个我真猜不出, 看你的代码就是从文件系统李找到一个文件ID对应的文件。 contextPath+"/"+"tempfile/filesystem/"+file.getFile_id()+"/"+file.getFs_files_name() 这一段已经是算文件路径了,
new RedirectRenderer(contextPath+"/"+"tempfile/filesystem/"+file.getFile_id()+"/"+file.getFs_files_name()); 使用构造方法产生了OutputRenderer, 接下来就只能看OutputRenderer 这里面提供什么方法了。
如果你的类里有方法返回 PrintWriter out 或者直接提供下载封装,我就不知道了,
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询