jsp實現文件上傳、下載


一、文件上傳

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM