Java Servlet下载文件(简单)


package com.bjdata.bjproduct.presentation.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

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

import com.bjdata.bjproduct.common.Constants;
import com.bjdata.bjproduct.persistence.system.model.User;
import com.sun.xml.internal.fastinfoset.stax.events.Util;


public class FileDownload extends HttpServlet {

	private int bufferSize=2048;
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request,response);
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		String bsize=config.getInitParameter("bufferSize");
		if(Util.isEmptyString(bsize)){
			bufferSize=Integer.parseInt(bsize);
		}
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String action="";
		try{
			
			request.setCharacterEncoding("UTF-8");
			response.setContentType("text/html;charset=UTF-8");
			
			String id=request.getParameter("id");
			String company=request.getParameter("company");
			action="/infoManager/getContract.do?id="+id+"&company="+company;
			//文件名必须带后缀名,否则 下载后是未知类型的文件
			String filename=request.getParameter("filename");
			String path = request.getParameter("path");
			
			path=request.getSession().getServletContext().getRealPath("/")+path;
			
			User sessionuser = (User) request.getSession(true).getAttribute(
					Constants.SESSION_USER);
			if(sessionuser!=null){
				//检测文件是否存在
				File file=new File(path);
				
				if(!file.exists()){
					request.setAttribute("msg","<script type=\"text/javascript\">alert(\"指定的文件不存在!\");</script>");
					request.getRequestDispatcher(action).forward(request, response);
				}else{
					response.reset();
					//将 文件流写入到前端浏览器
					response.setHeader("Content-disposition", "attachment;filename="+convertFileName(filename));
					ServletOutputStream sops=response.getOutputStream();
					FileInputStream fis=new FileInputStream(file);
					copyStream(fis,sops,true);
					fis.close();
					sops.close();
					fis=null;
					sops=null;
					file=null;
				}
				
			}
			else{
				//response.sendRedirect("index.jsp");(如果是重定向:index.jsp 中需要通过js控制跳到top.location.href="login.jsp")
//下面实现了 top.location.href="login.jsp" 的效果
				response.getWriter().print("<script type=\"text/javascript\">alert(\"请先登录后再下载!\");top.location.href='/bjproduct/';</script>");
			}
		}catch(Exception e){
			request.setAttribute("msg", "<script type=\"text/javascript\">alert(\"文件下载失败,请稍后再试...\");</script>");
			request.getRequestDispatcher(action).forward(request, response);
			e.printStackTrace();
		}
	}
	/**
	 * 复制流 到 前端浏览器
	 * @param source 源文件输入流
	 * @param dest 输出流
	 * @param flush 
	 * @return
	 */
	private final long copyStream(InputStream source,OutputStream dest,boolean flush){
		int bytes;
		long total=0l;
		byte [] buffer=new byte[bufferSize];
		try {
			while((bytes=source.read(buffer))!=-1){
				if(bytes==0){
					bytes=source.read();
					if(bytes<0)
						break;
					dest.write(bytes);
					if(flush)
					   dest.flush();
					total+=bytes;
				}
				dest.write(buffer,0,bytes);
				if(flush)
					dest.flush();
				total+=bytes;
			}
			
		} catch (IOException e) {
			throw  new RuntimeException("IOException caught while copying.",e);
		}
		return total;
	}
	
	//转换文件名的方法 在strust.xml中会用到  
    public String convertFileName(String cfilename){  
        try {  
        	cfilename=new String(cfilename.getBytes(),"ISO-8859-1");  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return cfilename;  
    } 
    
    
}

web.xml
 <!-- filedownload -->
  <servlet>
    <servlet-name>FileDownload</servlet-name>
    <servlet-class>com.bjdata.bjproduct.presentation.servlet.FileDownload</servlet-class>
    <init-param>
    	<param-name>bufferSize</param-name>
    	<param-value>2048</param-value>
    </init-param>
  </servlet>

<servlet-mapping>
    <servlet-name>FileDownload</servlet-name>
    <url-pattern>/download</url-pattern>
  </servlet-mapping>

注:下文中的 *** 代表文件名中的版本号。 # 【javax.servlet-api-***.jar中文文档.zip】 中包含: 中文文档:【javax.servlet-api-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【javax.servlet-api-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【javax.servlet-api-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【javax.servlet-api-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【javax.servlet-api-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: javax.servlet-api-***.jar中文文档.zip,java,javax.servlet-api-***.jar,javax.servlet,javax.servlet-api,***,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,javax,servlet,api,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【javax.servlet-api-***.jar中文文档.zip】,再解压其中的 【javax.servlet-api-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'javax.servlet', name: 'javax.servlet-api', version: '***' Gradle (Short): implementation 'javax.servlet:javax.servlet-api:***' Gradle (Kotlin): implementation("javax.servlet:javax.servlet-api:***") ``` # 含有的 Java package(包): ``` javax.servlet javax.servlet.annotation javax.servlet.descriptor javax.servlet.http ``` # 含有的 Java class(类)(此处仅列举3个): ``` javax.servlet.AsyncContext javax.servlet.AsyncEvent javax.servlet.AsyncListener ...... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值