1.?org.apache.struts.upload.*;

????????? 這個比較操作上比較簡單,用FormFile 得到一個上傳文件的FormFile對象,對象中保存了上傳文件的名字信息,上傳表單子段信息和本地上傳地址以及上傳文件的流信息。然后再寫到服務(wù)器文件中就ok了

?

												
												// …
// ① 檢查輸入請求是否為multipart的表單數(shù)據(jù)。??
FormFile image = myform.getImagefile();?? //?????????imagefile為FormFile對象;???

??? String basepath = Utils.getBasePath(request);???
if (null != image && image.getFileSize() > 0) {
???? imagename = member_id + "." + Utils.getFormFileType(image);??? //得到保存文件的類型
???????}?
Utils.saveFile(basepath, "memimage", imagename, image);?





												
												// …

?public static String getFormFileType(FormFile file) {
?????????????????String type = "";
?????????????????int tmp = file.getFileName().indexOf(".");
?????????????????if (tmp > 0) {
???????????????????? type = file.getFileName().substring(tmp + 1);
??????????????? }
?????????????????return type;
?????? }

???? public static void saveFile?(StringbasePath,String?subPath,String fileName,FormFile file)
throws Exception {
????????????????if (null == file || file.getFileSize() < 1) {
?????????????????? return;
???????????????? }
????????????????String filePath = basePath + "upload\\" + subPath+"\\";
?????????????????File fileTmp = new File(filePath);
?????????????????if (fileTmp.exists()) {
???????????????????if (!fileTmp.isDirectory()) {
??????????????????????????? throw new AppException("文件保存路徑錯誤!");
??????????????????????????}
??????????????????????} else {
??????????????????????????? fileTmp.mkdirs();
????????????????? }

???????????????fileTmp = new File(filePath + fileName);
???????????????FileOutputStream fo = new FileOutputStream(fileTmp);
???????????????fo.write(file.getFileData());
???????????????fo.close();
??? }?


?2.Jakarta Commons.FileUpload

首先創(chuàng)建一個HTML頁面。注意,凡是要上載文件的表單都必須設(shè)置enctype屬性,且屬性的值必須是multipart/form-data,同時請求方法必須是POST。下面的表單除了上載兩個文件,另外還有一個普通的文本輸入框:

<form name="myform" action="fileuploaddemo.jsp"
 method="post" enctype="multipart/form-data">
    輸入你的名字:<br />
      <input type="text" name="name" size="15"/><br />
  圖形:<br />
      <input type="file" name="imagefile"><br/>
  文件:<br />
      <input type="file" name="myfile"><br /><br />
    <input type="submit" name="Submit" 
     value="Submit your files"/>


												
												// …
// ① 檢查輸入請求是否為multipart的表單數(shù)據(jù)。
boolean isMultipart = FileUpload.
  isMultipartContent(request);
// …
// ② 為該請求創(chuàng)建一個句柄,通過它來解析請求。執(zhí)行
//    解析后,所有的表單項目都保存在一個List中。
DiskFileUpload upload = new DiskFileUpload();
// 通過句柄解析請求,解析得到的項目保存在一個List中
List items = upload.parseRequest(request);
// …
// ③ 通過循環(huán)依次獲得List里面的文件項目。要區(qū)分表示
//    文件的項目和普通的表單輸入項目,使用isFormField()
//    方法。根據(jù)處理請求的要求,我們可以保存上載的文
//    件,或者一個字節(jié)一個字節(jié)地處理文件內(nèi)容,或者打
//    開文件的輸入流。
Iterator itr = items.iterator();

while(itr.hasNext()) {
 FileItem item = (FileItem) itr.next();
        
// 檢查當(dāng)前的項目是普通的表單元素,還是一個上載的文件
 if(item.isFormField()) {
// 獲得表單域的名字
 String fieldName = item.getFieldName();
// 如果表單域的名字是name…
 if(fieldName.equals("name"))
  request.setAttribute("msg", 
  "Thank You: " + item.getString());
  
 } else {
// 該項目是一個上載的文件,把它保存到磁盤。
// 注意item.getName()
// 會返回上載文件在客戶端的完整路徑名稱,這似乎是一個BUG。
// 為解決這個問題,這里使用了fullFile.getName()。
  File fullFile  = new File(item.getName());  
  File savedFile = new File
  (getServletContext().getRealPath("/"),
  fullFile.getName());
  item.write(savedFile);
 }
}


  我們可以通過上載句柄的upload.setSizeMax來限制上載文件的大小。當(dāng)上載文件的大小超過允許的值時,程序?qū)⒂龅疆惓?。在上面的例子中,文件大小的限制值?1,表示允許上載任意大小的文件。

  還有其他一些略有變化的使用形式,正如前面所指出的,我們可以在上載的文件上打開一個輸入流,或者讓它們駐留在內(nèi)存中直至空間占用達(dá)到一定的限制值,或者在判斷文件類型的基礎(chǔ)上,以String或Byte數(shù)組的形式獲取其內(nèi)容,或者直接刪除文件。這一切都只要使用FileItem類提供的方法就可以方便地做到(DefaultFileItem是FileItem的一個實現(xiàn))。