文件的下载

来源:互联网 发布:大学生如何找兼职 知乎 编辑:程序博客网 时间:2024/05/19 04:04

package com.jsun.servlet;

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.jsun.entity.FileMes;
import com.jsun.service.FileMesService;
import com.jsun.util.MyBeanFactory;

/**
 * Servlet implementation class DownloadServlet
 */
@WebServlet(urlPatterns={"/DownloadServlet.jsp"})
public class DownloadFileServlet extends HttpServlet {

     public static final String FILE_DIR="d:/assets/files/";
 private static final long serialVersionUID = 1L;
      
    /**
     * @see HttpServlet#HttpServlet()
     */
    public DownloadFileServlet() {
        super();
    }

 /**
  * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  doPost(request, response);
 }

 /**
  * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  */
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   long id=Long.parseLong(request.getParameter("id"));
   String MIME="application/msword";   //文件MIME类型
   String fileName=MyBeanFactory.beanFactory.getBean("fileMesServiceImpl", FileMesService.class).getFileMes(new FileMes(id)).getName();
     
   downLoad(FILE_DIR+fileName, MIME, request, response);
 }
 /**
  * 执行下载
  * @param filePath
  * @param MIME
  * @param request
  * @param response
  * @throws IOException
  */
 private void downLoad(String filePath,String MIME,HttpServletRequest request, HttpServletResponse response) throws IOException{
  File file = new File(filePath); //取得要传送的文件,实际应用时可以将文件路径以参数的形式传入 
        long fileSize = file.length();  //文件长度 
        byte[] b=new byte[1024]; 
        FileInputStream fin = new FileInputStream(file); 
        DataInputStream in = new DataInputStream(fin); 
       
//      设置响应头信息,让下载的文件显示保存信息 
        response.setContentType("application/x-msdownload; charset=gbk"); 
        response.setHeader("Content-disposition", "attachment;filename="+new String(file.getName().getBytes("gbk"),"ISO8859_1")); 
        response.setContentType(MIME); //设置输出流的MIME类型
        response.setContentLength((int) fileSize);  //有什么区别 
//      response.setHeader("Content-length", filesize);  
       
        ServletOutputStream servletOut = response.getOutputStream(); 
//      发送文件数据,每次1024字节,最后一次单独计算 
        long totalsize = 0; 
        while(totalsize<fileSize){ 
            totalsize+=1024; 
            if(totalsize>fileSize){ //最后一次传送的字节数 
                byte[] leftpart = new byte[1024-(int)(totalsize-fileSize)]; 
                in.readFully(leftpart); 
                servletOut.write(leftpart); 
            } 
            else{ 
                in.readFully(b); //读1024个字节至字节数组b 
                servletOut.write(b); 
            } 
        } 
        servletOut.close(); 
 }

}

 

原创粉丝点击