JAVA通过访问路径和物理路径下载文件

根据访问路径下载文件

/**
     * 对账文件下载
     * */
    @RequestMapping(value = "/downFile/{recondileId}")
    public void downFile(@PathVariable String recondileId,
                        HttpServletRequest request,HttpServletResponse response) throws Exception{
        log.info("对账文件下载recondileId={}",recondileId);
        //根据recondileId查找对应的对账文件
        Criteria criteria = new Criteria();
        criteria.clear();
        criteria.put("recondileId",recondileId);
        List<TRecondile> recondileList = tRecondileService.selectByCondition(criteria);
        if (recondileList != null && recondileList.size() > 0) {
            String recondileUrl = recondileList.get(0).getRecondileUrl();
            InputStream inStream = DownloadFileUtil.getInputStreamByUrl(recondileUrl);
            response.reset();
            response.setContentType("application/octet-stream");
            try {
                //浏览器类型判断
                String BrowsersType = request.getHeader("User-Agent");
                String fileName = recondileUrl.substring(recondileUrl.lastIndexOf("/")+1);
                if (!BrowsersType.contains("Chrome") && !BrowsersType.contains("Firefox")) {
                    fileName = URLEncoder.encode(fileName, "UTF-8");
                } else {
                    fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
                }
                response.addHeader("Content-Disposition", "attachment;filename="+ fileName);
                // 循环取出流中的数据
                byte[] b = new byte[100];
                int len;
                while ((len = inStream.read(b)) > 0) {
                    response.getOutputStream().write(b, 0, len);
                }
            }catch (IOException e) {
                String msg = e.toString();
                if(msg.indexOf("ClientAbortException")!=-1){
                    log.info("用户取消下载...");
                }
            } catch (Exception e) {
                log.error("downFile",e);
            } finally {
                try {
                    inStream.close();
                } catch (IOException e) {
                    log.error("downFile",e);
                }
            }
        }
    }

根据物理路径下载文件

/**
     * 对账文件下载
     * */
    @RequestMapping(value = "/downFile/{recondileId}")
    public void downFile(@PathVariable String recondileId,
                        HttpServletRequest request,HttpServletResponse response) throws Exception{
        log.info("对账文件下载recondileId={}",recondileId);
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        //根据recondileId查找对应的对账文件
        Criteria criteria = new Criteria();
        criteria.clear();
        criteria.put("recondileId",recondileId);
        List<TRecondile> recondileList = tRecondileService.selectByCondition(criteria);
        if (recondileList != null && recondileList.size() > 0) {
            String recondilePath = recondileList.get(0).getRecondilePath();
            try{
                DownloadFileUtil.download(request,response,recondilePath);
            } catch (Exception e) {
                log.error("CanteenController.java-downFile-Exception: ", e);
                out.println("<script type='text/javascript'>alert('下载失败');history.go(-1);</script>");
            }finally {
                if (out != null) {
                    out.close();
                }
            }
 }
    }

工具类

package com.fjqwkj.commons.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;

import java.io.*;
import java.net.*;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * 下载文件工具类
 * @author lindr
 *
 */
@Slf4j
public class DownloadFileUtil {
	
	/**
	 * 普通下载
	 * @param path
	 * @param response
	 */
	public static  void 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="+ URLEncoder.encode(filename,"UTF-8"));
           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();
       }
   }
	/**
	 * 下载本地文件
	 * @param path
	 * @param response
	 * @throws FileNotFoundException
	 */
	public static  void  downloadLocal(String path,HttpServletResponse response)  throws  FileNotFoundException {
		path = path.replace("%20", " ");
        //文件名称 
	    String fileName = path.split("/")[path.split("/").length - 1];
        //读到流中 
        InputStream inStream  =   new  FileInputStream(path); //  文件的存放路径
        //  清空response 
        response.reset();
        response.setContentType("bin");
        try  {
        	response.addHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
	        //  循环取出流中的数据 
	        byte [] b  =   new   byte [ 100 ];
	        int  len;
	        while  ((len  =  inStream.read(b))  >   0 )
	        	response.getOutputStream().write(b,  0 , len);
            inStream.close();
        }  catch  (Exception e) {
           e.printStackTrace();
        }
	}
	
	 public static  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  static 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();
    }
	/**
	 * 下载本地文件
	 * 
	 * @param path
	 * @param response
	 * @throws FileNotFoundException
	 */
	public static void downloadLocal(String path, String fileName, HttpServletRequest request,HttpServletResponse response) throws FileNotFoundException {
		path = path.replace("%20", " ");
		// 文件名称
		if(null==fileName || "".equals(fileName))
			fileName = path.split("/")[path.split("/").length - 1];
		// 读到流中
		InputStream inStream = new FileInputStream(path); // 文件的存放路径
		// 清空response
		response.reset();
		response.setContentType("application/octet-stream");
		try {
			//浏览器类型判断
			String BrowsersType = request.getHeader("User-Agent");
			//谷歌和火狐的判断
			if (!BrowsersType.contains("Chrome") && !BrowsersType.contains("Firefox")) {
				fileName = URLEncoder.encode(fileName, "UTF-8");
			} else {//其他类型的
				fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
			}
			response.addHeader("Content-Disposition", "attachment;filename="+ fileName);
			// 循环取出流中的数据
			byte[] b = new byte[100];
			int len;
			while ((len = inStream.read(b)) > 0)
				response.getOutputStream().write(b, 0, len);
			
		} catch (IOException e) {
			String msg = e.toString();
			if(msg.indexOf("ClientAbortException")!=-1){
				System.out.println("用户取消下载...");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				inStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	public static HttpServletResponse downloadFile(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 static File downloadNet(String url,String filePath){
		//创建不同的文件夹目录
		File file = new File(filePath);
		//判断文件夹是否存在
		if (!file.exists()) {
			file.mkdirs();
		}
		FileOutputStream fileOut = null;
		HttpURLConnection conn = null;
		InputStream inputStream = null;
		try {
			// 建立链接
			URL httpUrl = new URL(url);
			conn = (HttpURLConnection) httpUrl.openConnection();
			//以Post方式提交表单,默认get方式
			conn.setRequestMethod("GET");
			conn.setDoInput(true);
			conn.setDoOutput(true);
			// post方式不能使用缓存
			conn.setUseCaches(false);
			//连接指定的资源
			conn.connect();
			//获取网络输入流
			inputStream = conn.getInputStream();
			BufferedInputStream bis = new BufferedInputStream(inputStream);
			//判断文件的保存路径后面是否以/结尾
			if (!filePath.endsWith("/")) {
				filePath += "/";
			}
			//写入到文件(注意文件保存路径的后面一定要加上文件的名称)
			String path = httpUrl.getPath();
			String fileName = path.substring(path.lastIndexOf("/")+1);
			fileOut = new FileOutputStream(filePath + fileName);
			BufferedOutputStream bos = new BufferedOutputStream(fileOut);
			byte[] buf = new byte[4096];
			int length = bis.read(buf);
			//保存文件
			while(length != -1) {
				bos.write(buf, 0, length);
				length = bis.read(buf);
			}
			bos.close();
			bis.close();
			conn.disconnect();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return file;
	}

	public static InputStream getInputStreamByUrl(String strUrl) {
		HttpURLConnection conn = null;
		try {
			URL url = new URL(strUrl);
			conn = (HttpURLConnection) url.openConnection();
			conn.setRequestMethod("GET");
			conn.setConnectTimeout(20 * 1000);
			final ByteArrayOutputStream output = new ByteArrayOutputStream();
			IOUtils.copy(conn.getInputStream(), output);
			return new ByteArrayInputStream(output.toByteArray());
		} catch (Exception e) {
			log.error("getInputStreamByUrl 异常,exception is {}", e);
		} finally {
			try {
				if (conn != null) {
					conn.disconnect();
				}
			} catch (Exception e) {
			}
		}
		return null;
	}


	public static void download(HttpServletRequest request, HttpServletResponse response, String filePath){
		File file = new File(filePath);
		// 取得文件名。
		String fileName = file.getName();
		InputStream fis = null;
		try {
			fis = new FileInputStream(file);
			request.setCharacterEncoding("UTF-8");
			String agent = request.getHeader("User-Agent").toUpperCase();
			if ((agent.indexOf("MSIE") > 0) || ((agent.indexOf("RV") != -1) && (agent.indexOf("FIREFOX") == -1))){
				fileName = URLEncoder.encode(fileName, "UTF-8");
			}
			else {
				fileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
			}
			response.reset();
			response.setCharacterEncoding("UTF-8");
			// 设置强制下载不打开
			response.setContentType("application/force-download");
			response.addHeader("Content-Disposition", "attachment;filename=" + fileName);
			response.setHeader("Content-Length", String.valueOf(file.length()));
			byte[] b = new byte[1024];
			int len;
			while ((len = fis.read(b)) != -1) {
				response.getOutputStream().write(b, 0, len);
			}
			response.flushBuffer();
			fis.close();
		}catch (IOException e) {
			throw new RuntimeException(e);
		}
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值