`

servlet下载文件

阅读更多
下载文件的servlet源码

package download;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintWriter;

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

public class DownloadFileServlet extends HttpServlet {

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		
		String password = request.getParameter("password");  //取得请求参数,这里只是将密码简单存放在一个数组里
		if((password==null)||!check(password)){
			response.setContentType("text/html;charset=gb2312");  //指定内容类型,并可以显示中文
			PrintWriter out = response.getWriter();  //取得要在响应中输出的文本流,即标准的html
			
			out.println("<html>");
			out.println("<head><title>下载信息</title></head>");
			
			out.println("<body>");
			out.println("<h1 align = 'center'>你输入的注册码不正确</h1><hr>");
			out.println("</body>");
			out.println("</html>");
			
			out.flush();
			out.close();
			
			
		}
		else{
			long totalsize = 0;
			File f = new File("c:/test.pdf"); //取得要传送的文件,实际应用时可以将文件路径以参数的形式传入
			long filelength = f.length();  //文件长度
			byte[] b=new byte[1024];
			FileInputStream fin = new FileInputStream(f);
			DataInputStream in = new DataInputStream(fin);
//			设置响应头信息,让下载的文件显示保存信息
			response.setHeader("Content-disposition", "attachment;filename="+"test.pdf");
			response.setContentType("application/pdf"); //设置输出流的MIME类型,打开pdf格式
			String filesize = Long.toString(filelength);
//			response.setContentLength(filelength);  有什么区别
			response.setHeader("Content-length", filesize); 
			
			ServletOutputStream servletOut = response.getOutputStream();
//			发送文件数据,每次1024字节,最后一次单独计算
			while(totalsize<filelength){
				totalsize+=1024;
				if(totalsize>filelength){ //最后一次传送的字节数
					byte[] leftpart = new byte[1024-(int)(totalsize-filelength)];
					in.readFully(leftpart);
					servletOut.write(leftpart);
				}
				else{
					in.readFully(b); //读1024个字节至字节数组b
					servletOut.write(b);
				}
			}
			servletOut.close();
			
		}
		
		}
//验证注册信息,实际应用中可转换为数据库中验证
	private boolean check(String password) {
		// TODO Auto-generated method stub
		String[] passwords ={"abc","bcd"};
		boolean flag = false;
		for(int i = 0;i<passwords.length;i++){
			if(passwords[i].equals(password)){
				flag = true;
				break;
			}
		}
		return flag;
	}

	public void init() throws ServletException {
		// Put your code here
		super.init();
	}

}

配置文件web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>DownloadFileServlet</servlet-name>
    <servlet-class>download.DownloadFileServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>DownloadFileServlet</servlet-name>
    <!--对应的index.jsp中表单的响应<form method ="POST" action = "DownloadFileServlet">-->

    <url-pattern>/DownloadFileServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>


首页
<%@ page language="java" contentType="text/html;charset=gb2312"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
	<head>
		<base href="<%=basePath%>">

		<title>文件下载例子</title>

	</head>

	<body>

		<form method="POST" action="DownloadFileServlet">

			<p>
				请输入注册码:
				<input type="text" name="password" size="20">
			</p>

			<p>
				<input type="submit" value="提交" name="B1">
			</p>
		</form>

	</body>
</html>

注册码错误



注册码成功



源码见附件
  • 大小: 39.7 KB
  • 大小: 17.8 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics