120 likes | 229 Views
客戶端的檔案上傳. HTML 的檔案欄位標籤 使用 Java I/O 類別上傳檔案 使用 JSP 檔案上傳套件上傳檔案. HTML 的檔案欄位標籤. HTML 檔案欄位可以在瀏覽程式檢視或選擇客戶端的檔案清單,選擇的檔案是儲存在客戶端電腦,然後將選擇檔案以 HTTP POST 方法上傳到 Web 伺服器,其基本語法如下所示: <input type="FILE" name="field_name"> 檔案欄位的主要目的是上傳檔案,所以表單 <form> 標籤需要設定 enctype 屬性,如下所示:
E N D
客戶端的檔案上傳 • HTML的檔案欄位標籤 • 使用Java I/O類別上傳檔案 • 使用JSP檔案上傳套件上傳檔案
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屬性為上傳檔案資料的編碼方式。
使用Java I/O類別上傳檔案-開啟串流 • 在建立上傳檔案的HTML表單後,表單處理的JSP程式可以使用Java I/O類別將上傳檔案資料寫成伺服端的檔案。首先取得輸入串流,如下所示: ServletInputStream in = request.getInputStream(); • 程式碼使用request物件的getInputStream()方法取得ServletInputStream的輸入串流,這就是客戶端上傳檔案的送出的檔案串流。 • 接著可以在伺服端開啟檔案輸出串流,如下: PrintWriter pw = new PrintWriter( new BufferedWriter(new FileWriter(name)));
使用Java I/O類別上傳檔案-上傳檔案 • 最後使用while迴圈建立伺服端檔案,如下所示: while ((ch = in.read()) != -1) pw.print((char) ch); • 上述while迴圈使用read()方法從ServletInputStream讀入資料後,馬上將它使用print()方法寫入PrintWriter串流的伺服端檔案。
範例 • <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>
範例 • <!-- 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>
使用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)
使用JSP檔案上傳套件上傳檔案-建立MultipartRequest物件使用JSP檔案上傳套件上傳檔案-建立MultipartRequest物件 使用O’Reilly上傳套件同時上傳多個檔案 • JSP程式可以使用page指引元素匯入套件的MultipartRequest類別,如下所示: <%@ page import="com.oreilly.servlet.MultipartRequest“ %> • 接下來可以建立MultipartRequest物件取得上傳檔案和檔案的相關資訊,如下所示: MultipartRequest mreq = new MultipartRequest( request,path,maxSize,"MS950");
使用JSP檔案上傳套件上傳檔案-MultipartRequest物件方法使用JSP檔案上傳套件上傳檔案-MultipartRequest物件方法
範例 • <%@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>
使用JSP檔案上傳套件上傳檔案-處理多個上傳檔案使用JSP檔案上傳套件上傳檔案-處理多個上傳檔案 • 在HTML表單上傳的檔案可能不只一個,JSP程式可以使用getFileNames()方法取得所有HTML檔案標籤name屬性值的Enumeration物件,然後配合while迴圈取出所有上傳檔案的相關資訊,如下所示: Enumeration files = mreq.getFileNames(); while ( files.hasMoreElements() ) { String name = (String)files.nextElement(); …………. }
範例 • <!-- 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>