jsp文件上傳、下載

1、文件上傳html

       上傳文件是Web開發中常常要用到的功能:例如在基於B/S的人事信息管理系統中上傳照片,在新聞發佈系統中上傳圖片等等。。。。。要實現文件上傳功能,就須要綜合利用java中的文件輸入和輸出相關的類。java

      在TCP/IP中,最先出現的文件上傳機制是FTP。它是將文件由客服端發送到服務器的標準機制,可以考慮到跨平臺的文本和二進制格式文件。可是在jsp編程中不能使用FTP方法來上傳文件,這是由jsp 運行機制所決定的。web

      下面是上傳文件的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>  
  1.    

      對於文件上傳表單處理其中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這個文檔。如:app

  1. <a href="http://localhost:8080/upload/user.doc">下載user.doc</a>  

當單擊這個超級連接時,將會在瀏覽器中直接打開這個文檔,就像是把word軟件嵌入在瀏覽器中同樣。dom

     打開文檔後就能夠實現另存爲了。固然在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類型的文件。瀏覽器則根據其擴展名和文件內容猜想其類型。。。

相關文章
相關標籤/搜索