您的位置:首页 > 其它

使用COS组件实现文件下载

2011-01-16 18:00 543 查看
这是一个Servlet应用。。



首先是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>DownloadServlet</servlet-name>
		<servlet-class>com.jadyer.servlet.DownloadServlet</servlet-class>
		<!-- 指定所要下载的文件,在本地服务器上的存储位置 -->
		<init-param>
			<param-name>filePath</param-name>
			<param-value>D://mydata//upload</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>DownloadServlet</servlet-name>
		<url-pattern>/servlet/DownloadServlet</url-pattern>
	</servlet-mapping>

	<welcome-file-list>
		<welcome-file>download.jsp</welcome-file>
	</welcome-file-list>
</web-app>


然后是为用户提供下载链接的download.jsp页面

<%@ page language="java" pageEncoding="UTF-8"%>

<a href="<%=request.getContextPath()%>/servlet/DownloadServlet?fileName=春天里1295154365000.mp3">点击下载歌曲:《春天里》</a>
<%--
这里的fileName参数,是以GET方式发送的,并且fileName的值对应的是服务器上的文件名称
也就是在web.xml中配置的filePath参数所指定的服务器上的该文件目录下所保存的文件名称
也就是说,此时的fileName指定的是已经被上传到服务器上的文件名,而非上传之前的文件名
--%>


最后是用来处理文件下载的核心Servlet

package com.jadyer.servlet;

import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oreilly.servlet.ServletUtils;

/**
 * 关于Struts2与COS
 * @see Struts2可能是由于License的原因,貌似不支持COS上传
 * @see 我们可以到Struts2的官网http://struts.apache.org/2.2.1.1/index.html查找一下
 * @see 点击Struts2首页左侧的FAQs,然后在新展开的页面中点击How do we upload files
 * @see 接着在新展开页面中点击See the file upload page链接
 * @see 此时就会打开http://struts.apache.org/2.2.1.1/docs/file-upload.html页面
 * @see 在该页面的最下方我们会看到,下面的一段话
 * @see There was a third alternative, cos, but it was removed due to licensing incompatibilities
 * @see 不过,已经有人尝试解决它了,也就是实现org.apache.struts2.dispatcher.multipart.MultiPartRequest接口
 * @see 然后在MultiPartRequest接口的实现类中,进行相应的处理,详情请参见http://www.javaeye.com/topic/316626
 */
public class DownloadServlet extends HttpServlet {
	private static final long serialVersionUID = -5675762049168848765L;

	private String filePath;

	public void init(ServletConfig config) {
		//取得web.xml中配置的filePath参数的值
		filePath = config.getInitParameter("filePath");
	}
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		this.doPost(request, response);
	}

	/**
	 * 此时需要在该Web项目中引入cos.jar
	 * 可通过http://www.servlets.com/cos/cos-26Dec2008.zip下载
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
		String fileName = request.getParameter("fileName");
		
		response.setContentType("application/octet-stream");
		response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
		
		//采用COS提供的ServletUtils类完成文件下载
		//在ServletUtils中一共提供了7个静态方法,可以实现不同场景的文件下载以及其它需求
		//其中使用returnFile()可以下载本地的文件,使用returnURL()可以下载网络上的文件
		//ServletUtils.returnURL(new URL("http://29.duote.org/javadmscgj.exe"), response.getOutputStream());
		ServletUtils.returnFile(filePath + "//" + fileName, response.getOutputStream());
	}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: