在一个链接中如果链接的是中文名字的链接,一般会报404错误,可以使用流的方式下载,即可以解决。
这是一个简单的页面,下载的文件包含中文名:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>下载测试</title>
</head>
<body>
<a href="loadFile?filename=迷失lost迷失2.doc">下载迷失文档</a>
</body>
</html>
通过web.xml配置文件可以找到处理类:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>LoadFileServlet</servlet-name> <servlet-class>july.DownLoadFile</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoadFileServlet</servlet-name> <url-pattern>/loadFile</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
处理类,把文件以流的方式送往客户端:
package july;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownLoadFile extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
OutputStream out = response.getOutputStream();
byte b[] = new byte[1024];
String filename = request.getParameter("filename");
filename = new String(filename.getBytes("ISO8859_1"),"utf-8");
System.out.println("filename"+filename);
File fileLoad = new File("F:/LostMusics/Season5", "迷失lost.doc");
response.setHeader("Content-disposition", "attachment;filename="
+ new String(filename.getBytes("GBK"),"ISO8859_1"));
response.setContentType("application/x-tar");
long fileLength = fileLoad.length();
String length = String.valueOf(fileLength);
response.setHeader("Content_Length", length);
FileInputStream in = new FileInputStream(fileLoad);
int n = 0;
while ((n = in.read(b)) != -1) {
out.write(b, 0, n);
}
}
}
这样下来,就可以下载有中文标题的链接了。
这里只是一个简单的例子,在实际中,取文件的方式和处理过程都不是这样。
新增方法:
导入包:JspSmartUpload.jar
建立一个jsp或者servlet作为下载通用页面,为简单其间,直接写在jsp页面中,如:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="com.jspsmart.upload.*" %>
<%
String fileName =request.getParameter("fileName");//从连接中传过来
String fullfile = "files/"+fileName; //得到文件全路径
// 新建一个SmartUpload对象
SmartUpload su = new SmartUpload();
// 初始化
su.initialize(pageContext);
// 设定contentDisposition为null以禁止浏览器自动打开文件,保证点击链接后是下载文件。
// 若不设定,则下载的文件扩展名为doc时,浏览器将自动用word打开它。
su.setContentDisposition(null);
// 下载文件
su.downloadFile(fullfile, null, new String(fileName.getBytes("gb2312"), "ISO8859-1"));
out.clear();
%>
在另一个页面中调用下载页面,如:
<input type="button" οnclick="javascript:document.location = 'download.jsp?fileName='wwwbepatientcom.jsp''" value="download"/>