1 / 12

客戶端的檔案上傳

客戶端的檔案上傳. HTML 的檔案欄位標籤 使用 Java I/O 類別上傳檔案 使用 JSP 檔案上傳套件上傳檔案. HTML 的檔案欄位標籤. HTML 檔案欄位可以在瀏覽程式檢視或選擇客戶端的檔案清單,選擇的檔案是儲存在客戶端電腦,然後將選擇檔案以 HTTP POST 方法上傳到 Web 伺服器,其基本語法如下所示: <input type="FILE" name="field_name"> 檔案欄位的主要目的是上傳檔案,所以表單 <form> 標籤需要設定 enctype 屬性,如下所示:

luyu
Télécharger la présentation

客戶端的檔案上傳

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 客戶端的檔案上傳 • HTML的檔案欄位標籤 • 使用Java I/O類別上傳檔案 • 使用JSP檔案上傳套件上傳檔案

  2. HTML的檔案欄位標籤 • HTML檔案欄位可以在瀏覽程式檢視或選擇客戶端的檔案清單,選擇的檔案是儲存在客戶端電腦,然後將選擇檔案以HTTP POST方法上傳到Web伺服器,其基本語法如下所示: <input type="FILE" name="field_name"> • 檔案欄位的主要目的是上傳檔案,所以表單<form>標籤需要設定enctype屬性,如下所示: <form action="filename.jsp" method="post" enctype="multipart/form-data"> • 表單的處理程式為JSP程式,使用post方法送出,encytype屬性為上傳檔案資料的編碼方式。

  3. 使用Java I/O類別上傳檔案-開啟串流 • 在建立上傳檔案的HTML表單後,表單處理的JSP程式可以使用Java I/O類別將上傳檔案資料寫成伺服端的檔案。首先取得輸入串流,如下所示: ServletInputStream in = request.getInputStream(); • 程式碼使用request物件的getInputStream()方法取得ServletInputStream的輸入串流,這就是客戶端上傳檔案的送出的檔案串流。 • 接著可以在伺服端開啟檔案輸出串流,如下: PrintWriter pw = new PrintWriter( new BufferedWriter(new FileWriter(name)));

  4. 使用Java I/O類別上傳檔案-上傳檔案 • 最後使用while迴圈建立伺服端檔案,如下所示: while ((ch = in.read()) != -1) pw.print((char) ch); • 上述while迴圈使用read()方法從ServletInputStream讀入資料後,馬上將它使用print()方法寫入PrintWriter串流的伺服端檔案。

  5. 範例 • <form action="Ch12_3_3.jsp" method="POST" • enctype="multipart/form-data"> • 選擇上傳檔案: <input type="FILE" name="file1"><br> • 選擇上傳檔案: <input type="FILE" name="file2"><br> • 選擇上傳檔案: <input type="FILE" name="file3"><br> • 上傳檔案說明: <input type="TEXT" name="description"><br><br> • <input type="submit" name="Upload" value="上傳檔案"> • </form><hr>

  6. 範例 • <!-- JSP程式:Ch12_3_2.jsp --> • <%@ page contentType="text/html; charset=MS950" • import="java.io.*"%> • <html> • <head><title>Ch12_3_2</title></head> • <body> • <% • // 輸出的檔案名稱 • String name=application.getRealPath("/a.txt"); • String file_name=request.getParameter("file1"); • out.println(file_name); • // 取得輸入串流 • ServletInputStream in = request.getInputStream(); • // 建立BufferedWriter的輸出串流物件 • PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(name))); • int ch; • // 將輸入串流的資料寫入檔案 • while ((ch = in.read()) != -1) • pw.print((char)ch); • pw.close(); // 關閉串流 • out.print("上傳檔案成功..."+name+"<br>"); • %> • </body> • </html>

  7. 使用JSP檔案上傳套件上傳檔案-下載與安裝O’Reilly上傳套件使用JSP檔案上傳套件上傳檔案-下載與安裝O’Reilly上傳套件 • O’Reilly上傳套件是由Jason Hunter開發的Java套件,可以免費下載使用在非商業用途的Web應用程式,免費下載網址如下所示: http://www.servlets.com/cos/ • 上述網址可下載最新版的上傳套件,下載檔案是ZIP格式壓縮檔,教學網頁上的版本是2002年11月版,檔案名稱為cos-05Nov2002.zip。 • O’Reilly上傳套件的安裝十分簡單,只需將檔案解壓縮到Web應用程式的「WEB-INF」資料夾即可,這是一些安裝在classes資料夾下,屬於com.oreilly.servlet.*套件的Java類別檔。 • 例如:將壓縮檔內的classes資料夾移入某專案檔內c:\workspace\file_up\WEB-INF\classes • (請使用refresh確保能正確的import)

  8. 使用JSP檔案上傳套件上傳檔案-建立MultipartRequest物件使用JSP檔案上傳套件上傳檔案-建立MultipartRequest物件 使用O’Reilly上傳套件同時上傳多個檔案 • JSP程式可以使用page指引元素匯入套件的MultipartRequest類別,如下所示: <%@ page import="com.oreilly.servlet.MultipartRequest“ %> • 接下來可以建立MultipartRequest物件取得上傳檔案和檔案的相關資訊,如下所示: MultipartRequest mreq = new MultipartRequest( request,path,maxSize,"MS950");

  9. 使用JSP檔案上傳套件上傳檔案-MultipartRequest物件方法使用JSP檔案上傳套件上傳檔案-MultipartRequest物件方法

  10. 範例 • <%@page import="com.oreilly.servlet.MultipartRequest"%> • <%@page contentType="text/html" pageEncoding="UTF-8"%> • <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> • <html> • <head> • <title>File_Chinese.jsp</title> • </head> • <body> • test • <% • // 宣告將上傳之檔案放置到伺服器的目錄中 • // 宣告限制上傳之檔案大小為 50 MB • String saveDirectory = "c:\\test"; //String saveDirectory =aplication.getRealPath(“/”); • int maxPostSize = 50 * 1024 * 1024 ; • // 宣告上傳檔案名稱 • String strFileName = null; • // 宣告上傳檔案型態 • String strContentType = null; • // 宣告敘述上傳檔案內容敘述 • String strDescription = null; • // 為Big5或MS950則支援中文檔名 • String enCoding = "MS950"; • out.println("Yes"); • // 產一個新的MultipartRequest 的物件,multi • MultipartRequest multi = new MultipartRequest(request, saveDirectory, maxPostSize, enCoding); • // 取得所有上傳之檔案輸入型態名稱及敘述 • strFileName = multi.getFilesystemName("File1"); • strContentType = multi.getContentType("File1"); • strDescription = multi.getParameter("Desc1"); • out.print("檔案名稱為:"+ strFileName+" 檔案型態為:"+ strContentType + • "檔案的敘述:"+strDescription +"<br>"); • %> • </body> • </html>

  11. 使用JSP檔案上傳套件上傳檔案-處理多個上傳檔案使用JSP檔案上傳套件上傳檔案-處理多個上傳檔案 • 在HTML表單上傳的檔案可能不只一個,JSP程式可以使用getFileNames()方法取得所有HTML檔案標籤name屬性值的Enumeration物件,然後配合while迴圈取出所有上傳檔案的相關資訊,如下所示: Enumeration files = mreq.getFileNames(); while ( files.hasMoreElements() ) { String name = (String)files.nextElement(); …………. }

  12. 範例 • <!-- JSP程式:Ch12_3_3.jsp --> • <%@ page contentType="text/html; charset=MS950"%> • <%@ page import="java.util.*"%> • <%@ page import="com.oreilly.servlet.MultipartRequest"%> • <html> • <head><title>Ch12_3_3.jsp</title></head> • <body> • <% • int fcount = 0; // 計算上傳檔案數 • // 指定上傳目錄 • String path = application.getRealPath("/"); • int maxSize = 2*1024*1024; // 上傳檔案最大尺寸為2MB • // 建立MultipartRequest物件 • MultipartRequest mreq = new MultipartRequest(request, path, maxSize, "MS950"); • // 取得表單欄位值 • String str = mreq.getParameter("description"); • out.print("說明: " + str + "<br>"); • // 使用Enumeration物件取得上傳檔案資訊 • Enumeration files = mreq.getFileNames(); • while ( files.hasMoreElements() ) { • String name = (String)files.nextElement(); • str = mreq.getFilesystemName(name); // 取得檔名 • if ( str != null ) { // 檔名不是null • fcount++; // 上傳檔案數加一 • out.print("編號: (" + fcount + ")<br>"); • out.print("檔名: " + str + "<br>"); • str = mreq.getContentType(name); // 取得型態 • out.print("型態: " + str + "<br>"); • } • } • out.print("上傳檔案數: " + fcount + "<br>"); • %> • </body> • </html>

More Related