實現過程:以匯出一個專案資訊為例。前臺傳專案的ID,後臺從資料庫中查出專案的相關資訊寫入Excel檔,然後對Excel檔進行壓縮,返回前臺下載位址。前臺進行下載後在伺服器端刪除Excel檔。
用到的技術:
①對Excel表格的操作。用到了一個韓國人寫的jxl.jar包直接百度搜最新的版本導入lib庫就可以直接用了。具體方法可以查API。
②壓縮檔。生成的Excel檔案名字需要唯一,以防止多人下載的時候引起不在控制內的問題,可以用日期作為名字。我用的是new Date().getTime()作為名字。在action中壓縮檔預設的路徑為Tomcat 5.5\bin 目錄下,而生成的Excel檔預設在Tomcat 5.5\webapps\工程目錄 檔下。如果保持這個預設目錄的話生成的壓縮檔就是原Excel的絕對路徑,被使用者下載後伺服器資訊就可能暴露,可能壓縮函數有其他方法重命名檔或者去除絕對路徑,我找了一會沒找到就想把Excel檔移到bin目錄下再壓縮。方法為srcFile.renameTo(targetFile)。srcFile和targetFile都是絕對路徑。
③獲得壓縮檔的絕對路徑傳給前臺。用coNtext.getRealPath(targetFile)獲得的是Tomcat 5.5\webapps\工程目錄,Tomcat 5.5\bin目錄沒有方法可以直接獲得,然後可以用一個小方法處理一下。思路為獲得工程目錄,從後往前截取兩級目錄加上/bin生成新的目錄。
這裡有一個小問題。String str = "C:\Program Files\Tomcat";是不對的,會報錯。因為轉義符「\」。但是使用方法coNtext.getRealPath(targetFile)獲得的字串就可以是上面的路徑。但是獲得的這個路徑不能進行split的操作,也是會因為有「\」的存在報錯的。我用的方法是用一個char陣列保存這個字串,將內容牆紙轉換為int型,找到「\」的位置將其變為,(在另一個相同的char陣列中轉換)然後再進行重新生成目標目錄的操作。
這個過程就像是掩耳盜鈴的感覺......Orz
 
jsp代碼:
 
String Fpath = session.getAttribute("path").toString();
String loadType = session.getAttribute("loadFile").toString();
String path = request.getCoNtextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 
//聲明要下載的檔loadFile
File loadFile=new File(Fpath);
//System.out.println(Fpath);
//聲明一個輸入檔流clientFile,接收並讀取己下載的檔
FileInputStream clientFile=new FileInputStream(loadFile);
//聲明一個輸出流serverFile獲取要下載的檔
OutputStream serverFile=response.getOutputStream();
try{
response.reset();
 
//下面這兩行是解決getOutputStream() has already been called for this response這個問題的
out.clear();
out = pageCoNtext.pushBody();
if(loadType.equals("zip")){//zip檔
//使用對話方塊保存檔
response.setHeader("Content-Disposition", "attachment; filename=" + "projects.zip");
//通知客戶要下載檔案類型
response.setContentType("application/octet-stream");
}
else{//Excel檔
//使用對話方塊保存檔
response.setHeader("Content-Disposition", "attachment; filename=" + "projects.xls");
//通知客戶要下載檔案類型
response.setContentType("application/msexcel");
}
//定義下載檔案的長度
long fileLength=loadFile.length();
//把長整形的檔長度轉換為字串
String length=String.valueOf(fileLength);
response.setContentLength(Integer.parseInt(length));
//response.setHeader("content_Length",length);
 
//把要下載的檔的內容讀入輸入流clientFile
int n=0;
byte b[]=new byte[1024];
while((n=clientFile.read(b))!=-1)
{
serverFile.write(b,0,n);
}
serverFile.flush();
serverFile.close();
clientFile.close();
serverFile = null;
clientFile = null;
 
File del=new File(Fpath);
 
try{
if(del.delete()){
del = null;
}
else{
}
}catch(Exception delerror){
}
 
}catch(Exception e){
 
}
finally{
try{
serverFile.flush();
serverFile.close();
clientFile.close();
serverFile = null;
clientFile = null;
loadFile.delete();
}catch(Exception ee){
}
}
 
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()