Jakata 上傳檔案

原创 2005年02月28日 08:58:00
在網頁裡常會看到上傳檔案的功能,這個看起來很平常的功能Servlet API裡卻沒有提供! 對初學者來說這可真是晴天霹靂!! 很幸運的是,Java的世界裡,總是有免費的大餐可以吃! 網路上有許多人針對Servlet API的這項缺失寫了許多免費的API,這裡要介紹的是Apache所提供的API。
  Apache的API可以到http://jakarta.apache.org/commons/fileupload/下載,API的說明可以參考 http://jakarta.apache.org/commons/fileupload/apidocs/index.html 接下我將Apache提供的範例略微改寫並簡單的講解。
  如果要上傳檔案,網頁一定要這麼寫…

<FORM ENCTYPE='multipart/form-data' method='POST' action='myservlet'>
<INPUT TYPE='file' NAME='theFile1'>
<INPUT TYPE='file' NAME='theFile2'>
<INPUT TYPE='submit' VALUE='上傳'>
</FORM>

要特別注意紅色的部份,如此,可以產生如下的網頁,使用者可點選"瀏覽"的按鈕來選擇要上傳的檔案,然後按"上傳"即可將檔案上傳,由myservlet負責接收。為什麼要這麼寫呢? 有興趣的人可以自行參考 RFC 1867



接下來我們來看myservlet怎麼寫…

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import java.util.*;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.*;

public class myservlet extends HttpServlet implements Servlet {

 public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  DiskFileUpload fu = new DiskFileUpload();
  fu.setSizeMax(10000000); //上傳的檔案最大可以有1000000 bytes
  fu.setSizeThreshold(4096); //最多可以在memery中有4096 bytes的cache
  fu.setRepositoryPath("/"); //檔案大於getSizeThreshold時的暫存路徑
  List fileItems = null;
  try {
   fileItems = fu.parseRequest(req);
  } catch (FileUploadException e) {
   e.printStackTrace();
  }
  Iterator i = fileItems.iterator();
  while (i.hasNext()) {
   FileItem fi = (FileItem)i.next();
   String fileName = getFilename(fi.getName()); //fi.getName()得到的是包含路徑的檔名
   File f = new File("/upload/" + fileName);
   try {
    fi.write(f); //將檔案寫到磁碟
   } catch (Exception e1) {
    e1.printStackTrace();
   }
  }

 }

 //將路徑過濾掉,只傳回檔名
 public String getFilename(String fullname) {
  String filename = null;

  fullname = fullname.replace('//', '/' );
  StringTokenizer token = new StringTokenizer(fullname, "/");
  while (token.hasMoreTokens()) {
   filename = token.nextToken();
  }

  return filename;
 }
}
SECTION 01 FileUpload 總覽

在撰寫網站程式的時候, client 與 server 之間的往往不只有純文字的溝通, 還會有 binary 的檔案傳輸, 該如何在 HTML Form 之中傳送, 就要遵守 RFC 1867 的規範了.

基本上, post.jsp (選擇檔案)應該都會有下面類似的 html tag :


<form action="upload.jsp"  enctype="multipart/form-data"  method="POST">
	input your name: <input type="text" name="name"> <br>
	select the file: <input type="file" name="file"> <br>
	<input type="submit" value="submit">
</form>

這一部份是屬於 HTML 的範疇, 有興趣的可以鑽研 RFC ...



SECTION 02 multipart/form-data 的 HTTP 表現情形

當你按下傳送的時候, Browser 將會送出 Post 的資料到 server,

POST http://localhost:9000/fileupload/upload.jsp HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, */*
Referer: http://localhost:9000/fileupload/post.jsp
Accept-Language: zh-tw,zh-cn;q=0.7,en-us;q=0.3
Content-Type: multipart/form-data; boundary=---------------------------7d33e580784
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: www.softleader.com.tw
Content-Length: 3020
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: JSESSIONID=3B31F07F56328E7B623A9BA1C4E3479D
我們可以知道, Contenet-Type 是用 multipart/form-data 另外還有 boundary 的傳輸.


SECTION 03 實際的例子 File.html by 林上傑






<html>
<head>
<title>File Upload</title>
<meta http-equiv="Content-Type" content="text/html; charset=big5">
</head>
<body bgcolor="#FFFFFF" text="#000000"><p><font size="5"color="#FF0000">
<b>第七章 檔案上傳範例</b></font></p>

<form name="Form1" enctype="multipart/form-data" method="post" action="JYFile.jsp"> 
<p>上傳檔案 1: <input type="file"name="File1" size="20" maxlength="20"> </p>
<p>檔案1敘述: <input type="text" name="File1" size="30" maxlength="50"> </p>
<p>上傳檔案 2: <input type="file" name="File2" size="20" maxlength="20"> </p>
<p>檔案2敘述: <input type="text" name="File2" size="30" maxlength="50"> </p>
<p>上傳檔案3: <input type="file" name="File3" size="20" maxlength="20"> </p>
<p>檔案3敘述: <input type="text" name="File3" size="30" maxlength="50"> </p>
<p> <input type="submit"value="上傳"> <input type="reset" value="清除"> </p>
</form>

</body>
</html>




SECTION 04 傳送格式

 



SECTION 05 送到 JYFile.jsp 上傳處理 by JiaYun







家芸妹妹把註解說明的很清楚了, 有心的人就仔細查閱吧 ~~~


SECTION 06 Struts FileUpload

為何 struts 1.1 要等 Commons-FileUpload 1.0 呢



因為 struts 有一個 subpackage 叫做 org.apache.struts.upload.*; 這裡面就是設定相關的 file 格式如果你使用 struts 為 MVC Framework 就可以參考 example 中的 struts-upload.war 的開發



(1) 建立 upload.jsp

<html:form action="upload.do?queryParam=Successful" enctype="multipart/form-data">
檔案敘述:<html:text property="theText" /><br>
選擇檔案:<html:file property="theFile" /><br>
</html:form>




(2) 建立 UploadForm.java

public class UploadForm extends ActionForm{
	..........     
	public String getTheText() {
		return theText;    
	}    
	public void setTheText(String theText) {        
		this.theText = theText;    
	}    
	public FormFile getTheFile() {        
		return theFile;    
	}    
	public void setTheFile(FormFile theFile) {
		this.theFile = theFile;
	}
	..........
}
請注意 FormFile 是建立在 org.apache.struts.upload 這個 package 中的



(3) 撰寫 UploadAction

public ActionForward execute(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response){
	UploadForm theForm = (UploadForm) form;
	String text = theForm.getTheText();
	FormFile file = theForm.getTheFile();
	String fileName= file.getFileName();
	String contentType = file.getContentType();
	String size = (file.getFileSize() + " bytes");
	.... // 看你要如何處理
	.... // 可以用 InputStream 取得 file.getInputStream 等等
	return mapping.findForward("ThePageYouWannaGo");
}




(4) 建立 struts-config.xml

  <form-beans>    
  <form-bean name="uploadForm" 
        type="org.apache.struts.webapp.upload.UploadForm" />  
  </form-beans>  
  <action-mappings>    
  <!-- Upload Action -->    
  <action path="/upload" type="org.apache.struts.webapp.upload.UploadAction" 
        name="uploadForm" scope="request" input="/upload.jsp">        
  <forward name="display" path="/display.jsp" />   
  </action>

使用ajax上傳檔案

  • 2011年05月10日 16:36
  • 38KB
  • 下载

ruby 语法(ARGV,传参数)--读取文件档案

脚本读取的文字档案: ex15_sample.txt This is stuff I typed into a file. It is really cool stuff. Lots and lo...

FTP檔案上傳程式

  • 2012年11月29日 14:07
  • 3.41MB
  • 下载

Linux 档案权限设置,预设权限、添加用户、用户组、查看

1、# chown   ( change owner的简称): 改变档案的拥有者                          chown user1 filename  :档案拥有者为user1...

多個檔案上傳模組,php

  • 2011年07月31日 01:39
  • 219KB
  • 下载

PHP 檔案上傳

  • 2006年02月23日 09:05
  • 2KB
  • 下载

POI提供API给Java程序对Microsoft Office格式档案读和写的功能

Apache POI是一种流行的API,它允许程序员使用Java程序创建,修改和显示MS Office文件。这由Apache软件基金会开发使用Java分布式设计或修改Microsoft Office文...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Jakata 上傳檔案
举报原因:
原因补充:

(最多只允许输入30个字)