第12章 JSP的檔案與電子郵件處理 12-1 伺服端的檔案處理 12-2 伺服端檔案的讀取與寫入 12-3 客戶端的檔案上傳 12-4 JavaMail寄送電子郵件
12-1 伺服端的檔案處理 12-1-1 建立檔案 12-1-2 顯示檔案資訊 12-1-3 更改檔名與檔案刪除 12-1-4 顯示檔案和資料夾清單
12-1 伺服端的檔案處理 伺服端的檔案處理是處理位在Web應用程式所在電腦的檔案,而不是客戶端瀏覽程式所在電腦的檔案。在JSP程式是使用Java I/O套件的File類別在伺服端建立檔案、顯示指定的檔案資訊、更改檔案名稱、刪除檔案或取得指定資料夾的檔案和子資料夾清單。 換句話說,在本節的JSP程式之前需要使用page指引的import屬性匯入java.io.*套件,如下所示: <%@ page contentType="text/html; charset=MS950" import="java.io.*"%>
12-1-1 建立檔案 JSP程式建立伺服端的檔案是使用File類別方法,首先需要使用建構子建立File物件,如下所示: File file = new File(path + "Ch12_1_1.txt"); 上述File物件的建構子參數是檔案的絕對路徑,我們可以使用application物件的getRealPath()方法來取得,如下所示: String path = application.getRealPath("/"); 上述程式碼可以取得Web應用程式根目錄的實際路徑。在建立好File物件後,就可以使用createNewFile()方法建立新檔案,如下所示: file.createNewFile();
12-1-2 顯示檔案資訊 File物件提供相關方法可以取得檔案或資料夾的相關資訊,如下表所示:
12-1-3 更改檔名與檔案刪除 File物件提供相關方法可以更改檔案或資料夾名稱,和刪除檔案,如下表所示:
12-1-4 顯示檔案和資料夾清單 在JSP程式只需建立File物件,就可以進一步使用list()方法取得檔案和資料夾清單,例如:取得File物件file的所有檔案和子資料夾,如下所示: filenames = file.list(); 上述filenames是String字串陣列,每一個陣列元素就是此路徑取得的一個檔案或資料夾名稱。
12-2 伺服端檔案的讀取與寫入 12-2-1 寫入文字檔案 12-2-2 讀取文字檔案 12-2-3 檔案複製 12-2-4 二進位檔案的讀寫
12-2 伺服端檔案的讀取與寫入 JSP程式可以使用Java I/O套件的FileWriter和FileReader類別執行文字檔案的讀寫,這是一種檔案串流(Stream),串流如同水管的水流,當程式開啟一個來源的輸入串流(例如:檔案、記憶體和緩衝區等),JSP程式可以從輸入串流依序讀取資料。 程式輸出資料是開啟一個目的(同樣可以是檔案、記憶體和緩衝區等)的輸出串流,然後將資料寫入串流。例如:檔案複製程式開啟來源檔案的輸入串流和目的檔案的輸出串流,接著從來源串流讀取資料後,馬上寫入輸出串流的目的檔案,就可以完成檔案複製。
12-2-1 寫入文字檔案 在JSP程式可以使用FileWriter物件開啟檔案串流來寫入資料,如下所示: FileWriter output = new FileWriter(path); 上述程式碼的參數path是檔案路徑字串。第2個參數是檔案寫入方式,如下所示: FileWriter output = new FileWriter(path, true); 上述參數值true表示新增檔案資料,也就是將資料寫入檔尾。在開啟output檔案串流後,就可以使用write()方法將字串寫入檔案,當使用write()方法完成資料寫入後,別忘了!使用close()方法關閉檔案串流,如下所示: output.close();
12-2-2 讀取文字檔案 在JSP程式可以使用FileReader物件開啟檔案串流讀取檔案內容,檔案使用BufferedReader緩衝器串流加速資料處理且使用readLine()方法一行一行的讀取資料,如下所示: BufferedReader input = new BufferedReader(new FileReader(file)); 在開啟檔案輸入串流後,就可以使用while迴圈配合readLine()方法讀取檔案內容,如下所示: while ( (str = input.readLine()) != null ) { …… }
12-2-3 檔案複製 在JSP程式使用FileReader和FileWriter串流分別開啟來源和目的檔案串流,就可以使用while迴圈複製檔案內容,如下所示: while ( (ch = input.read()) != -1 ) output.write(ch); 上述程式碼使用read()方法讀取一個整數,如果傳回-1,表示讀到檔尾,然後使用write()方法馬上將整數寫入目的檔案,等到迴圈結束,就完成檔案複製。
12-2-4 二進位檔案的讀寫 對於是二進位檔案,JSP程式是使用InputStream/OutputStream類別的位元組串流來處理檔案讀取和寫入,InputStream/OutputStream類別提供對應Reader/Writer類別的方法,可以讀取和寫入位元組或位元組陣列,如下表所示:
12-3 客戶端的檔案上傳 12-3-1 HTML的檔案欄位標籤 12-3-2 使用Java I/O類別上傳檔案 12-3-3 使用JSP檔案上傳套件上傳檔案
12-3-1 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屬性為上傳檔案資料的編碼方式。
12-3-2 使用Java I/O類別上傳檔案-開啟串流 在建立上傳檔案的HTML表單後,表單處理的JSP程式可以使用Java I/O類別將上傳檔案資料寫成伺服端的檔案。首先取得輸入串流,如下所示: ServletInputStream in = request.getInputStream(); 程式碼使用request物件的getInputStream()方法取得ServletInputStream的輸入串流,這就是客戶端上傳檔案的送出的檔案串流。 接著可以在伺服端開啟檔案輸出串流,如下: PrintWriter pw = new PrintWriter( new BufferedWriter(new FileWriter(name)));
12-3-2 使用Java I/O類別上傳檔案-上傳檔案 最後使用while迴圈建立伺服端檔案,如下所示: while ((ch = in.read()) != -1) pw.print((char) ch); 上述while迴圈使用read()方法從ServletInputStream讀入資料後,馬上將它使用print()方法寫入PrintWriter串流的伺服端檔案。
12-3-3 使用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類別檔。
12-3-3 使用JSP檔案上傳套件上傳檔案-建立MultipartRequest物件 使用O’Reilly上傳套件同時上傳多個檔案 JSP程式可以使用page指引元素匯入套件的MultipartRequest類別,如下所示: <%@ page import="com.oreilly.servlet.MultipartRequest“ %> 接下來可以建立MultipartRequest物件取得上傳檔案和檔案的相關資訊,如下所示: MultipartRequest mreq = new MultipartRequest( request,path,maxSize,"MS950");
12-3-3 使用JSP檔案上傳套件上傳檔案-MultipartRequest物件方法
12-3-3 使用JSP檔案上傳套件上傳檔案-處理多個上傳檔案 在HTML表單上傳的檔案可能不只一個,JSP程式可以使用getFileNames()方法取得所有HTML檔案標籤name屬性值的Enumeration物件,然後配合while迴圈取出所有上傳檔案的相關資訊,如下所示: Enumeration files = mreq.getFileNames(); while ( files.hasMoreElements() ) { String name = (String)files.nextElement(); …………. }
12-4 JavaMail寄送電子郵件 12-4-1 JavaMail API 12-4-2 使用JavaMail寄送電子郵件 12-4-3 電子郵件的附檔處理
12-4-1 JavaMail API-JavaMail的基礎 JavaMail是昇陽API套件,其相關類別可以輕鬆建立電子郵件系統,內建支援郵件通訊協定POP3、SMTP和IMAP4。簡單的說,JavaMail API套件的相關類別是在模擬一套郵件工具,其主要類別,如下所示: javax.mail.Session類別。 javax.mail.Message類別。 javax.mail.Transport類別。 javax.mail.Folder類別。 javax.mail.Store類別。 在本節主要說明電子郵件的寄送,所以只會使用Session、Message和Transport三個類別。
12-4-1 JavaMail API-下載 在昇陽網站可以免費下載JavaMail API,本書使用的版本是1.3.2,其下載網址,如下所示: http://java.sun.com/products/javamail/downloads/index.html 在上述網址可以下載ZIP格式的壓縮檔:javamail-1_3_2.zip。JavaMail API需要配合JavaBeans Activation Framework(JAF)處理附檔,所以我們還需要下載JAF,本書使用的版本是1.0.2,其下載網址,如下所示: http://java.sun.com/products/javabeans/glasgow/jaf.html 上述網址可以下載ZIP格式的壓縮檔:jaf-1_0_2-upd.zip。
12-4-1 JavaMail API-安裝 安裝JavaMail API的第一步是使用解壓縮工具從壓縮檔取出2個JAR檔案,如下所示: mail.jar檔案:從JavaMail API下載檔案javamail-1_3_2.zip取出mail.jar檔案。 activation.jar檔案:從JAF下載檔案jaf-1_0_2-upd.zip取出activation.jar檔案。 第二步在Resin的JSP容器安裝JavaMail,就是將mail.jar和activation.jar兩個檔案複製到Resin安裝目錄的「C:\resin-3.0.9\lib」資料夾。
12-4-2 使用JavaMail寄送電子郵件-匯入套件與伺服器設定 在JSP程式使用JavaMail API需要匯入一些套件,如下所示: <%@ page import="java.util.*, java.io.*"%> <%@ page import="javax.mail.*"%> <%@ page import="javax.mail.internet.*"%> 在匯入上述套件後,JSP程式需要先設定系統使用的郵件伺服器和通訊協定,如下所示: Properties props = new Properties(); props.put("mail.host", "ms2.hinet.net"); props.put("mail.transport.protocol", "smtp");
12-4-2 使用JavaMail寄送電子郵件-取得Session物件 在建立MimeMessage的電子郵件前,JSP程式需要先取得Session物件,如下所示: Session s = Session.getInstance(props, null); 上述程式碼使用getInstance()方法取得Session物件,參數是前述Properties物件。
12-4-2 使用JavaMail寄送電子郵件- 建立MimeMessage物件 在取得Session物件後,就可以建立MimeMessage物件,即一封電子郵件,如下所示: MimeMessage msg = new MimeMessage(s); 上述程式碼使用Session物件的建構子參數建立MimeMessage物件,然後使用MimeMessage物件的方法指定郵件內容。
12-4-2 使用JavaMail寄送電子郵件- MimeMessage物件方法
12-4-2 使用JavaMail寄送電子郵件- Transport物件 Transport物件使用類別方法send()來寄送電子郵件,如下所示: Transport.send(msg); 上述程式參數是MimeMessage物件,可以將參數的電子郵件寄送出去。
12-4-3 電子郵件的附檔處理-說明 對於HTML格式或附檔郵件來說,在MIME郵件內容需要分成多個區段,多區段MIME郵件內容是一個MimeMultipart物件,每一個區段是一個MimeBodyPart物件,如下所示: 一般郵件區段:MIME郵件的文字內容部分,這是MimeBodyPart物件,可以指定郵件內容是一般文字或HTML文件。 附檔區段:MIME郵件的附檔部分也是MimeBodyPart物件,我們需要使用JAF的DataHandler類別來處理附檔。
12-4-3 電子郵件的附檔處理-建立MimeMultipart物件 寄送MimeMessage物件的郵件擁有多區段MIME郵件內容,需要建立MimeMultipart物件儲存郵件內容,如下所示: MimeMultipart mm = new MimeMultipart(); 上述程式碼在建立好MimeMultipart物件後,就可以分別建立各區段的MimeBodyPart物件,然後使用addBodyPart()方法新增MimeBodyPart物件的郵件區段。
12-4-3 電子郵件的附檔處理-HTML格式郵件 對於多區段的MIME郵件來說,文字內容部分是一個MimeBodyPart物件,如下所示: MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setContent(text, type); setContent()方法可以指定郵件內容,第2個參數是字串內容的MIME型態,值"text/html;charset=Big5"為HTML格式,值"text/plain;charset=Big5"是一般文字內容。 接著將區段新增到MimeMultipart物件的多區段郵件內容,如下所示: mm.addBodyPart(mbp1);
12-4-3 電子郵件的附檔處理-附檔處理1 在電子郵件如果擁有附檔,檔案需要先上傳到伺服器,才能將附檔內容新增到電子郵件中,JSP程式可以使用MultipartRequest物件上傳檔案後,然後使用getParameter()方法取得郵件內容,對於附檔來說是取得附檔名稱,如下所示: String filename = mreq.getFilesystemName("file"); 上述程式碼取得附檔檔名後,就可以建立附檔的MimeBodyPart物件的區段,如下所示: MimeBodyPart mbp2 = new MimeBodyPart();
12-4-3 電子郵件的附檔處理-附檔處理2 在建立MimeBodyPart物件後,需要使用FileDataSource物件取得附檔的資料來源,如下所示: FileDataSource fds = new FileDataSource(path+filename); mbp2.setDataHandler( new DataHandler(fds)); mbp2.setFileName(fds.getName()); 在建立好區段的內容後,就可以將區段新增到MimeMultipart物件的多區段郵件內容,如下所示: mm.addBodyPart(mbp2);
12-4-3 電子郵件的附檔處理-指定MimeMessage物件的郵件內容 現在的MimeMultipart物件一共擁有mbp1和mbp2兩個區段,最後,可以指定MimeMessage物件的郵件內容,如下所示: msg.setContent(mm); 上述程式碼使用MimeMessage物件的setContent()方法指定參數MimeMultipart物件的郵件內容。