|
|
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已! |
|
恭喜您是本站第 1728673
位訪客!
登入 | 註冊
|
|
|
|
發表者 |
討論內容 |
冷日 (冷日) |
發表時間:2008/3/18 3:28 |
- Webmaster

- 註冊日: 2008/2/19
- 來自:
- 發表數: 15771
|
- [教學]Java Servlet檔案上傳方案
- HTML表單(form)裡面現在都支援了FILE類型(TYPE="file"),
允許使用者將電腦裡的檔案透過表單的方式傳送到SERVER, 上傳的時候,編碼是採用 MULTIPART/FORM-DATA 和一般表單的編碼是不一樣的, 所以SERVLET無法以一般的表單擷取方式取得資料, 此時的request物件的getParameter方法是無用武之地的!
許多公司或團體就因應這問題提出了一些方案, 有也相關的API可以參考, 再此列出一些比較有名的方案: jspSmart - jspSmartUpload ( http://www.jspsmart.com/ ) O'Pielly - MultipartRequest ( http://www.servlets.com/cos/javadoc/com/oreilly/servlet/MultipartRequest.html ) Jakarta - fileupload ( http://jakarta.apache.org/commons/fileupload/ )
但是因為jspSmart 已經關佔了,所以此處不再多做說明, 冷日分別針對另外兩郭方法提出範例!
O'Pielly - MultipartRequest :
import com.oreilly.servlet.*;
MultipartRequest mr = new MultipartRequest(req , req.getRealPath("/") + "tmp" , FILE_MAX_SIZE);
File uf = mr.getFile("uploadfile");
Jakarta - fileupload :
import org.apache.commons.fileupload.*;
public void doPost(HttpServletRequest req, HttpServletResponse res)
{
DiskFileUpload fu = new DiskFileUpload();
// maximum size before a FileUploadException will be thrown
fu.setSizeMax(1000000);
// maximum size that will be stored in memory
fu.setSizeThreshold(4096);
// the location for saving data that is larger than getSizeThreshold()
fu.setRepositoryPath("/tmp");
List fileItems = fu.parseRequest(req);
// assume we know there are two files. The first file is a small
// text file, the second is unknown and is written to a file on
// the server
Iterator i = fileItems.iterator();
String comment = ((FileItem)i.next()).getString();
FileItem fi = (FileItem)i.next();
// filename on the client
String fileName = fi.getName();
// write the file
fi.write("/www/uploads/" + fileName);
}
這裡都只是很簡單的用法, 目的只是抓到上傳的檔案, 供大家參考!
|
|
冷日 (冷日) |
發表時間:2010/8/1 8:40 |
- Webmaster

- 註冊日: 2008/2/19
- 來自:
- 發表數: 15771
|
- [教學]Commons FileUpload不能上傳中文檔名?
- 大家在使用Commons FileUpload的時候,應該不少人會碰到中文檔名上傳變成亂碼的問題吧!?
這很明顯得又是Java編碼、Client編碼、Server環境編碼中間轉換的問題! 不能否認,Java上這類的問題還真的蠻多低,這裡來跟大家說一下怎麼解決!
首先,必須先跟大家說明的是,如果request.getCharacterEncoding沒有設定(也就是request.getCharacterEncoding() == null)的話,系統會用Server編碼來處理。 而我們一般來說不會用這樣的編碼來做前端,此時上傳的檔案名稱一定就會變成亂碼。
所以如果要上傳檔案可以使用中文檔名的話,有以下幾種方案: 1.讓你的Server環境和你開發出來的編碼相同! 也就是說,如果你都是使用UTF-8編碼開發的話,就讓你的系統環境也是UTF-8吧! (謎:不過MS系統好像沒辦法設定底層編碼喔!? 2.看你的Server系統是啥編碼,改用那個編碼開發! MS的系統底層一般來說是MS950,也就是說你所有開發都採行MS950編碼,也就可以了! (謎:MS950可以多語系嗎?怎麼有種自廢武功的感覺 3.把getCharacterEncoding搞定就好啦! 如果上述兩個方法都不行(這不是行不行的問題吧!?是好不好的問題吧!? )的話,那我們就讓FileUpload的CharacterEncoding正確不就好了嗎!? 只要在接收上傳檔案的頁面上加上
<% request.setCharacterEncoding("UTF-8"); %>
這樣就搞定了! (謎:冷日只要是Java開發的東西,都一定採UTF-8編碼,這不正是Java的本意嗎!?
希望這樣可以幫上大家解決中文檔名上傳的問題。 PS:這裡有參考文件Createor2檔案上傳元件-上傳中文檔名解法
|
|
|
|