1. 程式人生 > >JavaWeb響應下載(包含工具類)

JavaWeb響應下載(包含工具類)

文件的 瀏覽器下載 後綴 寫文件 部分 https res 文件路徑 form

紙上得來終覺淺,絕知此事要躬行!今天博主分享是關於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工具類是我自己寫的,下來我粘到文章中

package org.cxxy.base.cxsc.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletResponse;

/**
 * @Title: DownUtil.java
 * @Package org.cxxy.base.cxsc.util
 * @Description:文件下載工具類
 * @author ChoviWu
 * @date 2017年6月18日 下午2:44:17
 * @version V1.0
 */
public class DownUtil {

	/**
	 * 
	 * @Description:
	 * @param @param response
	 * @param @param url 文件在數據庫的路徑
	 * @param @param base 文件存放的基礎路徑
	 * @param @param folderPath 上傳所在的文件夾
	 * @param @return
	 * @param @throws IOException
	 * @return int
	 * @throws
	 */
	@SuppressWarnings("unused")
	public static int downFile(HttpServletResponse response, String url,
			Integer down, 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 {
			// 拋異常
			response.getWriter()
					.write("<script charset=‘utf-8‘ type=‘text/javascript‘>alert(‘該資源不存在!‘);history.go(-1);</script>");
			return down;
		}
		down++;
		return down;
	}

	/**
	 * 
	 * @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();
				bis.close();
				bos.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();

JavaWeb響應下載(包含工具類)