附件/文件下載功能 數據存儲在數據庫表中,字段類型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;
}