zoukankan      html  css  js  c++  java
  • JavaWeb响应下载(包含工具类)

    纸上得来终觉浅,绝知此事要躬行!今天博主分享是关于javaweb的响应(response)下载

    以下是我的Demo:

    页面我就粘主要部分的代码

    <a href = "${pageContext.request.contextPath }/user/courseTab">模板下载</a>

     

    当然,现在的项目大家都使用框架,这里我使用的是(SSM),好了,粘代码

    @Controller
    @RequestMapping("/user")
    public class UploadController {
    @RequestMapping(value="/courseTab",method=RequestMethod.GET)
    	public void courseTab(HttpServletResponse response,HttpServletRequest request) throws IOException{
    		String path = request.getSession().getServletContext().getRealPath("/courseTab/课表上传模板.xls");
    		DownUtil.downMb(response, path, "课表模板"+DateFormat.formatSimple(new Date()));
    }
    }
    

     这里我使用的DownUtil工具类是我自己写的,下来我粘到文章中

    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    
    import javax.servlet.http.HttpServletResponse;
    
    /**
     * @Title: DownUtil.java
     * @Description:文件下载工具类
     * @author ChoviWu
     */
    public class DownUtil {
    
    	/**
    	 * 
    	 * @Description:
    	 * @param @param response
    	 * @param @param url 文件在数据库的路径
    	 * @param @param base 文件存放的基础路径
    	 * @param @param folderPath 上传所在的文件夹
    	 * @param @return
    	 * @param @throws IOException
    	 * @return int
    	 * @throws
    	 */
    	public static void downFile(HttpServletResponse response, String url,
    		 String base, String folderPath) throws IOException {
    		// 文件的名称
    		String fileName = url.split("/")[1];
    		System.out.println(fileName);
    		// 文件的后缀
    		String last = url.substring(url.lastIndexOf(".") + 1);
    		System.out.println(last);
    		// 文件路径
    		String downFilePath = base + folderPath + fileName;
    
    		Long fileLength = new File(downFilePath).length();// 文件的长度
    		if (fileLength != 0) {
    			response.reset();
    			response.setContentType("application/octet-stream;charset=utf-8"); // 改成输出excel文件
    			try {
    				response.setHeader(
    						"Content-disposition",
    						"attachment; filename="
    								+ new String(fileName.getBytes("utf-8"),
    										"ISO8859-1"));
    				response.setHeader("Content-Length", String.valueOf(fileLength));
    			} catch (UnsupportedEncodingException e) {
    				e.printStackTrace();
    			}
    			BufferedInputStream bis = null;
    			BufferedOutputStream bos = null;
    			FileInputStream fis = null;
    			try {
    				fis = new FileInputStream(downFilePath);
    				bis = new BufferedInputStream(fis);
    				// 输出流
    				bos = new BufferedOutputStream(response.getOutputStream());
    				byte[] buff = new byte[2048];
    				int bytesread;
    				// 写文件
    				while (-1 != (bytesread = bis.read(buff, 0, buff.length))) {
    					bos.write(buff, 0, bytesread);
    				}
    				// 跳转的路径
    				fis.close();
    				bis.close();
    				bos.close();
    
    			} catch (FileNotFoundException e) {
    				System.out.println("File is Not Exsist!");
    			}
    
    		} else {
    			// 抛异常
    			
    		}
    	}
    
    	/**
    	 * 
    	 * @Description: 下载的模板
    	 * @param @param response
    	 * @param @param path 路径名
    	 * @param @param name 模板名称
    	 * @param @throws IOException
    	 * @return void
    	 * @throws
    	 */
    	@SuppressWarnings("unused")
    	public static void downMb(HttpServletResponse response, String path,
    			String name) throws IOException {
    
    		Long fileLength = new File(path).length();// 文件的长度
    		System.out.println("文件的长度:" + fileLength);
    		if (fileLength != 0) {
    			response.reset();
    			response.setContentType("application/octet-stream;charset=utf-8"); // 改成输出excel文件
    			try {
    				response.setHeader(
    						"Content-disposition",
    						"attachment; filename="
    								+ new String(name.getBytes("utf-8"),
    										"ISO8859-1"));
    				response.setHeader("Content-Length", String.valueOf(fileLength));
    			} catch (UnsupportedEncodingException e) {
    				e.printStackTrace();
    			}
    			BufferedInputStream bis = null;
    			BufferedOutputStream bos = null;
    			FileInputStream fis = null;
    			try {
    				fis = new FileInputStream(path);
    				bis = new BufferedInputStream(fis);
    				// 输出流
    				bos = new BufferedOutputStream(response.getOutputStream());
    				byte[] buff = new byte[2048];
    				int bytesread;
    				// 写文件
    				while (-1 != (bytesread = bis.read(buff, 0, buff.length))) {
    					bos.write(buff, 0, bytesread);
    				}
    				fis.close();
    			
    
    			} catch (FileNotFoundException e) {
    				System.out.println("File is Not Exsist!");
    
    			}
    		}
    	}
    }
    

     下来,我说一下,调用的downMb,我们都知道,在服务器上下载一个文件,

    //设置响应头,控制浏览器下载该文件,形参调的是文件的长度

    response.setHeader("Content-Length", String.valueOf(fileLength));
    

     //设置响应类型,设置输出流类型

    response.setContentType("application/octet-stream;charset=utf-8"); // 改成输出excel文件
    

     这里我使用的是输出的Excel文件

    接下来就是读文件,写文件了,相信学了java基础的都会接触IO吧,这里我就略过

    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    

    这里使用的是缓冲流,因其使用的是浏览器打开文件的下载

    下来就是写文件了,写文件也是一贯的套路,先把文件存到buff数据缓冲区,然后将buff的数据输出到浏览器供用户查看

    byte[] buff = new byte[2048];
    	int bytesread;
    	// 写文件
    	while (-1 != (bytesread = bis.read(buff, 0, buff.length))) {
    		bos.write(buff, 0, bytesread);
    	}
    

     

    当读写完文件之后,千万别忘了要关闭文件流(当然,关闭流的顺序也不能变)

    fis.close();
    bis.close();
    bos.close();
    

     

  • 相关阅读:
    linux tcpdump补充
    一个由有符号下标引起的bug
    leetcode-First Missing Positive
    Flutter移动电商实战 --(26)列表页_使用Provide控制子类-2
    Flutter移动电商实战 --(25)列表页_使用Provide控制子类-1
    Flutter移动电商实战 --(24)Provide状态管理基础
    Flutter移动电商实战 --(23)分类页_左侧类别导航制作
    Flutter移动电商实战 --(22)JSON解析和复杂数据模型转换技巧
    [翻译] NSDate-TimeAgo
    Replace-iOS
  • 原文地址:https://www.cnblogs.com/ChoviWu/p/7150070.html
Copyright © 2011-2022 走看看