jsp實現檔案上傳、下載

來源:互聯網
上載者:User

一、檔案上傳

       上傳檔案是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類型的檔案。瀏覽器則根據其副檔名和檔案內容猜測其類型。。。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.