一、檔案上傳
上傳檔案是Web開發中經常要用到的功能:例如在基於B/S的人事資訊管理系統中上傳照片,在新聞發布系統中上傳圖片等等。。。。。要實現檔案上傳功能,就需要綜合利用java中的檔案輸入和輸出相關的類。
在TCP/IP中,最早出現的檔案上傳機制是FTP。它是將檔案由客服端發送到伺服器的標準機制,能夠考慮到跨平台的文本和二進位格式檔案。但是在jsp編程中不能使用FTP方法來上傳檔案,這是由jsp 運行機制所決定的。
下面是上傳檔案的jsp頁面:
1 <form action="file?file=upload" method="post" enctype="multipart/form-data">2 請選擇你要上傳的檔案:<input type="file" name="upload" siez="16"><br>3 <input type="submit" value="提交"> 4 </form>
對於檔案上傳表單處理其中method必須為post,也要增加類型enctype="multipart/form-data"。這樣就可以把檔案中的資料作為流式資料上傳。當然無論是什麼檔案格式,均可以。。。
下面是servlet 處理常式:
1 //接收上傳檔案內容中臨時檔案的檔案名稱 2 String tempFileName = new String("tempFileName"); 3 //tempfile 對象指向臨時檔案 4 File tempFile = new File("D:/"+tempFileName); 5 //outputfile 檔案輸出資料流指向這個臨時檔案 6 FileOutputStream outputStream = new FileOutputStream(tempFile); 7 //得到客服端提交的所有資料 8 InputStream fileSourcel = request.getInputStream(); 9 //將得到的客服端資料寫入臨時檔案10 byte b[] = new byte[1000];11 int n ;12 while ((n=fileSourcel.read(b))!=-1){13 outputStream.write(b,0,n);14 }15 16 //關閉輸出資料流和輸入資料流17 outputStream.close();18 fileSourcel.close();19 20 //randomFile對象指向臨時檔案21 RandomAccessFile randomFile = new RandomAccessFile(tempFile,"r");22 //讀取臨時檔案的第一行資料23 randomFile.readLine();24 //讀取臨時檔案的第二行資料,這行資料中包含了檔案的路徑和檔案名稱25 String filePath = randomFile.readLine();26 //得到檔案名稱27 int position = filePath.lastIndexOf('\\');28 CodeToString codeToString = new CodeToString();29 String filename = codeToString.codeString(filePath.substring(position,filePath.length()-1));30 //重新置放讀取檔案指標到檔案頭31 randomFile.seek(0);32 //得到第四行斷行符號符的位置,這是上傳檔案資料的開始位置33 long forthEnterPosition = 0;34 int forth = 1;35 while((n=randomFile.readByte())!=-1&&(forth<=4)){36 if(n=='\n'){37 forthEnterPosition = randomFile.getFilePointer();38 forth++;39 }40 }41 42 //產生上傳檔案的目錄43 File fileupLoad = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file","upLoad");44 fileupLoad.mkdir();45 //saveFile 對象指向要儲存的檔案46 File saveFile = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename);47 RandomAccessFile randomAccessFile = new RandomAccessFile(saveFile,"rw");48 //找到上傳檔案資料的結束位置,即倒數第四行49 randomFile.seek(randomFile.length());50 long endPosition = randomFile.getFilePointer();51 int j = 1;52 while((endPosition>=0)&&(j<=4)){53 endPosition--;54 randomFile.seek(endPosition);55 if(randomFile.readByte()=='\n'){56 j++;57 }58 }59 60 //從上傳檔案資料的開始位置到結束位置,把資料寫入到要儲存的檔案中61 randomFile.seek(forthEnterPosition);62 long startPoint = randomFile.getFilePointer();63 while(startPoint<endPosition){64 randomAccessFile.write(randomFile.readByte());65 startPoint = randomFile.getFilePointer();66 }67 //關閉檔案輸入、輸出68 randomAccessFile.close();69 randomFile.close();70 tempFile.delete();
其中CodeToString()方法是一個中文字元處理的方法。如果檔案不進行編碼轉換,則上傳後的檔案名稱將會是亂碼,接收的檔案資料也會是亂碼:
下面是CodeToString()原始碼:
1 //處理中文字串的函數 2 public String codeString(String str){ 3 String s = str; 4 try { 5 byte[] temp = s.getBytes("utf-8"); 6 s = new String(temp); 7 return s ; 8 } catch (UnsupportedEncodingException e) { 9 e.printStackTrace();10 return s;11 }12 }
二:檔案下載
實現檔案下載的最簡單的方法就是使用超連結。假設在伺服器上web目錄下地upload子目錄存在user.doc這個文檔。如:
<a href="http://localhost:8080/upload/user.doc">下載user.doc</a>
當單擊這個超級連結時,將會在瀏覽器中直接開啟這個文檔,就像是把word軟體嵌入在瀏覽器中一樣。
開啟文檔後就可以實現另存新檔了。當然在web上,最常見的方式是單擊連結後,出現“另存新檔”對話方塊:
1 //擷取要下載的檔案名稱 2 String filename = request.getParameter("name"); 3 //得到想客服端輸出的輸出資料流 4 OutputStream outputStream = response.getOutputStream(); 5 //輸出檔案用的位元組數組,每次向輸出資料流發送600個位元組 6 byte b[] = new byte[600]; 7 //要下載的檔案 8 File fileload = new File("D:/work space/JSP workspace/jsp_servlet_upAndLoad/file/upLoad",filename); 9 //客服端使用儲存檔案的對話方塊10 response.setHeader("Content-disposition", "attachment;filename="+filename);11 //通知客服檔案的MIME類型12 response.setContentType("application/msword");13 //通知客服檔案的長度14 long fileLength = fileload.length();15 String length = String.valueOf(fileLength);16 response.setHeader("Content_length", length);17 //讀取檔案,並發送給客服端下載18 FileInputStream inputStream = new FileInputStream(fileload);19 int n = 0;20 while((n=inputStream.read(b))!=-1){21 outputStream.write(b,0,n);22 }
在該程式中,response對象的setContentType()用來定義伺服器發送給客服端內容的MIME類型。這裡對MIME就不特別介紹了。事實上,凡是瀏覽器能處理的所有資源都有對應的MIME資源類型。在與伺服器的互動中,瀏覽器就是對html、jsp等檔案瀏覽器直接將其開啟。對於word、excel等瀏覽器自身不能開啟的檔案則調用相應的方法。對於沒有標記MIME類型的檔案。瀏覽器則根據其副檔名和檔案內容猜測其類型。。。