java 文件下载实例

简单的来说  Java 文件下载主要分四步


1.设置文件ContentType类型

2.设置文件头

3.通过response获取ServletOutputStream对象(out)

4.写到输出流(out)中

同时需要俩个jar包 commons-fileupload.jar和commons-io.jar


Java代码   收藏代码
  1. import org.springframework.stereotype.Controller;  
  2. import org.springframework.web.bind.annotation.RequestMapping;  
  3. import org.springframework.web.context.ServletContextAware;  
  4.   
  5. import javax.servlet.ServletContext;  
  6. import javax.servlet.ServletOutputStream;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. import java.io.*;  
  9.   
  10. @Controller  
  11. public class FileController implements ServletContextAware{  
  12.     //Spring这里是通过实现ServletContextAware接口来注入ServletContext对象  
  13.     private ServletContext servletContext;  
  14.   
  15.   
  16.     @RequestMapping("file/download")  
  17.     public void fileDownload(HttpServletResponse response){  
  18.         //获取网站部署路径(通过ServletContext对象),用于确定下载文件位置,从而实现下载  
  19.         String path = servletContext.getRealPath("/");  
  20.   
  21.         //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型  
  22.         response.setContentType("multipart/form-data");  
  23.         //2.设置文件头:最后一个参数是设置下载文件名(假如我们叫a.pdf)  
  24.         response.setHeader("Content-Disposition""attachment;fileName="+"a.pdf");  
  25.         ServletOutputStream out;  
  26.         //通过文件路径获得File对象(假如此路径中有一个download.pdf文件)  
  27.         File file = new File(path + "download/" + "download.pdf");  
  28.   
  29.         try {  
  30.             FileInputStream inputStream = new FileInputStream(file);  
  31.   
  32.             //3.通过response获取ServletOutputStream对象(out)  
  33.             out = response.getOutputStream();  
  34.   
  35.             int b = 0;  
  36.             byte[] buffer = new byte[512];  
  37.             while (b != -1){  
  38.                 b = inputStream.read(buffer);  
  39.                 //4.写到输出流(out)中  
  40.                 out.write(buffer,0,b);  
  41.             }  
  42.             inputStream.close();  
  43.             out.close();  
  44.             out.flush();  
  45.   
  46.         } catch (IOException e) {  
  47.             e.printStackTrace();  
  48.         }  
  49.     }  
  50.   
  51.     @Override  
  52.     public void setServletContext(ServletContext servletContext) {  
  53.         this.servletContext = servletContext;  
  54.     }  
  55. }  


复制代码

    public HttpServletResponse download(String path, HttpServletResponse response) {
        
try {
            
// path是指欲下载的文件的路径。
            File file = new File(path);
            
// 取得文件名。
            String filename = file.getName();
            
// 取得文件的后缀名。
            String ext = filename.substring(filename.lastIndexOf("."+ 1).toUpperCase();

            
// 以流的形式下载文件。
            InputStream fis = new BufferedInputStream(new FileInputStream(path));
            
byte[] buffer = new byte[fis.available()];
            fis.read(buffer);
            fis.close();
            
// 清空response
            response.reset();
            
// 设置response的Header
            response.addHeader("Content-Disposition""attachment;filename=" + new String(filename.getBytes()));
            response.addHeader(
"Content-Length""" + file.length());
            OutputStream toClient 
= new BufferedOutputStream(response.getOutputStream());
            response.setContentType(
"application/octet-stream");
            toClient.write(buffer);
            toClient.flush();
            toClient.close();
        } 
catch (IOException ex) {
            ex.printStackTrace();
        }
        
return response;
    }

    
public void downloadLocal(HttpServletResponse response) throws FileNotFoundException {
        
// 下载本地文件
        String fileName = "Operator.doc".toString(); // 文件的默认保存名
        
// 读到流中
        InputStream inStream = new FileInputStream("c:/Operator.doc");// 文件的存放路径
        
// 设置输出的格式
        response.reset();
        response.setContentType(
"bin");
        response.addHeader(
"Content-Disposition""attachment; filename=\"" + fileName + "\"");
        
// 循环取出流中的数据
        byte[] b = new byte[100];
        
int len;
        
try {
            
while ((len = inStream.read(b)) > 0)
                response.getOutputStream().write(b, 
0, len);
            inStream.close();
        } 
catch (IOException e) {
            e.printStackTrace();
        }
    }

    
public void downloadNet(HttpServletResponse response) throws MalformedURLException {
        
// 下载网络文件
        int bytesum = 0;
        
int byteread = 0;

        URL url 
= new URL("windine.blogdriver.com/logo.gif");

        
try {
            URLConnection conn 
= url.openConnection();
            InputStream inStream 
= conn.getInputStream();
            FileOutputStream fs 
= new FileOutputStream("c:/abc.gif");

            
byte[] buffer = new byte[1204];
            
int length;
            
while ((byteread = inStream.read(buffer)) != -1) {
                bytesum 
+= byteread;
                System.out.println(bytesum);
                fs.write(buffer, 
0, byteread);
            }
        } 
catch (FileNotFoundException e) {
            e.printStackTrace();
        } 
catch (IOException e) {
            e.printStackTrace();
        }
    }

复制代码
//支持在线打开文件的一种方式
复制代码
     public   void  downLoad(String filePath, HttpServletResponse response,  boolean  isOnLine)  throws  Exception {
        File f 
=   new  File(filePath);
        
if  ( ! f.exists()) {
            response.sendError(
404 " File not found! " );
            
return ;
        }
        BufferedInputStream br 
=   new  BufferedInputStream( new  FileInputStream(f));
        
byte [] buf  =   new   byte [ 1024 ];
        
int  len  =   0 ;

        response.reset(); 
//  非常重要
         if  (isOnLine) {  //  在线打开方式
            URL u  =   new  URL( " file:/// "   +  filePath);
            response.setContentType(u.openConnection().getContentType());
            response.setHeader(
" Content-Disposition " " inline; filename= "   +  f.getName());
            
//  文件名应该编码成UTF-8
        }  else  {  //  纯下载方式
            response.setContentType( " application/x-msdownload " );
            response.setHeader(
" Content-Disposition " " attachment; filename= "   +  f.getName());
        }
        OutputStream out 
=  response.getOutputStream();
        
while  ((len  =  br.read(buf))  >   0 )
            out.write(buf, 
0 , len);
        br.close();
        out.close();
    }


猜你喜欢

转载自blog.csdn.net/hiboyljw/article/details/71440328