在一个链接中如果链接的是中文名字的链接,一般会报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" onclick="javascript:document.location = 'download.jsp?fileName='wwwbepatientcom.jsp''" value="download"/>