blob類型字段 文件下載

附件/文件下載功能 數據存儲在數據庫表中,字段類型blob

根據 pk_val 值查找到對應附件記錄,T_MX_ATTACHMENT附件表
att_file 附件存儲字段名 blob類型
//主要代碼
public String downLoad(String guid, HttpServletRequest request,
HttpServletResponse response) {

	String finStr = "false";
	InputStream in = null;
	try{
		String sql = "select attachment_id,att_size,att_name,att_file from T_MX_ATTACHMENT where pk_val = ? ";//and att_name like '%"+filename+"%'
		List cxlist = hibernateDao.executeSqlQuery(sql, new Object[]{guid});
		for (int i = 0; i < cxlist.size(); i++) {
			Object[] ydArr = (Object[]) cxlist.get(0);
			String filename = ydArr[2].toString();
			long length = 0;
			if(ydArr[3]!=null){
				Blob blob = (Blob) ydArr[3];
				in = blob.getBinaryStream();
				length = blob.length();
			}
			
			// 設置response的編碼方式
			response.setContentType("application/x-msdownload");
			// 寫明要下載的文件的大小
			response.setContentLength((int) length);
			// 解決中文亂碼
			response.setHeader("Content-Disposition", "attachment;filename="+ new String(filename.getBytes("gbk"), "iso-8859-1"));//new String(filename.getBytes("utf-8"), "iso-8859-1"))
			// 讀出文件到i/o流
			BufferedInputStream buff = new BufferedInputStream(in);
			byte[] b = new byte[1024];// 相當於我們的緩存
			long k = 0;// 該值用於計算當前實際下載了多少字節
			// 從response對象中得到輸出流,準備下載
			OutputStream myout = response.getOutputStream();
			
			// 開始循環下載
			while (k < length) {
				int j = buff.read(b, 0, 1024);
				k += j;
				// 將b中的數據寫到客戶端的內存
				myout.write(b, 0, j);
			}
			// 將寫入到客戶端的內存的數據,刷新到磁盤
			myout.flush();
			myout.close();
			
		}
		finStr = "success";
	}catch (Exception e) {
		e.printStackTrace();
	}finally{
		if (in != null) {
			try {
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	return finStr;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章