Date: 2005-03-06T00:31:31
   Editor: DakotaJack
   Wiki: Apache Struts Wiki
   Page: StrutsUpload
   URL: http://wiki.apache.org/struts/StrutsUpload

   no comment

Change Log:

------------------------------------------------------------------------------
@@ -14,32 +14,27 @@
       throws Exception {
     HttpSession    sess   = req.getSession();
     Upload         upload = (Upload)sess.getAttribute(UploadConstant.UPLOAD);
-
     if(upload == null) {
       upload = new Upload();
       sess.setAttribute(UploadConstant.UPLOAD,upload);
     }
-
     if(upload.isMultipart(req)) {
       Monitor progress = 
(UploadMonitorProgress)sess.getAttribute(UploadConstant.MONITOR);
-
       if(progress == null) {
         progress = new UploadMonitorProgress();
         sess.setAttribute(UploadConstant.MONITOR,progress);
       }
-
       List monitors = Collections.synchronizedList(new LinkedList());
+      int    size = UploadConstant.MAX_FILE_SIZE;
+      int    type = UploadConstant.DIR;
+      String path = LoadFileUtil.getUploadPath(type,user.getId());
+      String temp = LoadFileUtil.UPLOAD_TEMP_FILES;
+      String code = UploadConstant.DEFAULT_ENCODING;
       monitors.add(progress);
-      String userStore = LoadFileUtil.getUploadPath(user.getId());
-
-      upload.setStore(UploadConstant.DIR,userStore);
-      upload.setStoreTmpDir(LoadFileUtil.UPLOAD_TEMP_FILES);
-      
upload.process(req,monitors,UploadConstant.DEFAULT_ENCODING,UploadConstant.MAX_UPLOADED_FILE_SIZE);
-      upload.store();
-
+      upload.process(req,monitors,code,size);
+      upload.store(type, path, temp);
       sess.setAttribute(UploadConstant.REPORT,UploadReport.getReport(upload));
     }
-
     return new ActionForward(...);;
   }
 }
@@ -74,6 +69,7 @@
  2.  !UploadFileItem (implements org.apache.commons.fileupload.!FileItem)
  3.  !UploadFileItemFactory (extends 
org.apache.commons.fileupload.!DefaultFileItemFactory)
  4.  Monitor
+ 5.  Upload
 
 == Code ==
 
@@ -280,13 +276,13 @@
                              List               monitors)
       throws UploadException,
              IOException {
-    this(req, monitors, UploadConstant.MAX_UPLOADED_FILE_SIZE);
+    this(req, monitors, UploadConstant.MAX_FILE_SIZE);
   }
 
   public UploadMultipartData(HttpServletRequest req)
       throws UploadException,
              IOException {
-    this(req, null, UploadConstant.MAX_UPLOADED_FILE_SIZE);
+    this(req, null, UploadConstant.MAX_FILE_SIZE);
   }
 
   public Iterator getParameterNames() {
@@ -720,6 +716,404 @@
   public void read(int contentLength);
   public void notify(UploadParams uploadParams, MultipartFile uploadFile);
 }
+}}}
+
+=== Upload ===
+
+{{{
+public class Upload {
+  private MultipartData data;
+
+  private List    monitors       = Collections.synchronizedList(new 
LinkedList());
+  private List    history        = Collections.synchronizedList(new 
LinkedList());
+
+  private List    excludedExts   = Collections.synchronizedList(new 
LinkedList());
+  private List    includedExts   = Collections.synchronizedList(new 
LinkedList());
+  private boolean isExcludedExts = true;
+
+  private String  storeLocation;
+  private int     storeType      = 0;
+  private List    storeMemory    = Collections.synchronizedList(new 
LinkedList());
+
+  private int     maxFileNumber  = -1;
+  private long    maxFileSize    = 0x100000000L;
+
+  private boolean overwrite      = false;
+
+  public Upload() {}
+
+  public int     getStoreType()     { return storeType; }
+  public List    getStoreMemory()   { return storeMemory; }
+  public String  getStoreLocation() { return storeLocation; }
+
+  public boolean isExcludedExts()   { return isExcludedExts; }
+  public long    getFileSizeLimit() { return maxFileSize; }
+  public boolean getOverwrite()     { return overwrite; }
+  public int     getMaxFiles()      { return maxFileNumber; }
+  public String  getSystemTempDir() { return UploadConstant.SYSTEM_TEMPDIR; }
+  public List    getHistory()       { return history; }
+
+  public void store(int    storeType,
+                    String storeLocation,
+                    String tmpPath) // location null if memory
+      throws UploadException,
+             IOException {
+    setStore(storeType,storeLocation);
+    setStoreTmpDir(tmpPath);
+    Map           files = data.getFiles();
+    Iterator      iter  = files.keySet().iterator();
+    String        fileName;
+    MultipartFile multipartFile;
+
+    while(iter.hasNext()) {
+      fileName      = (String)iter.next();
+      multipartFile = (MultipartFile)files.get(fileName);
+
+      if(storeType == UploadConstant.DIR && storeLocation != null) {
+        folder(multipartFile);
+      } else if(storeType == UploadConstant.ZIP && storeLocation != null) {
+        zip(multipartFile);
+      } else if(storeType == UploadConstant.MEM && storeMemory != null) {
+        memory(multipartFile);
+      } else {
+        throw new UploadException(UploadConstant.STORE_NOT_SET);
+      }
+    }
+  }
+
+  public void setMaxFiles(int maxFileNumber)     { this.maxFileNumber = 
maxFileNumber; }
+  public void setFileSizeLimit(long maxFileSize) { this.maxFileSize = 
maxFileSize; }
+  public void setOverwrite(boolean overwrite)    { this.overwrite = overwrite; 
}
+
+  public void setExcludedExts(String exts) {
+    StringTokenizer st = new StringTokenizer(exts, ",");
+    while(st.hasMoreElements()) {
+      excludedExts.add(st.nextElement());
+    }
+    isExcludedExts = true;
+  }
+
+  public void setIncludedExts(String exts) {
+    StringTokenizer st = new StringTokenizer(exts, ",");
+
+    while(st.hasMoreElements()) {
+      includedExts.add(st.nextElement());
+    }
+
+    isExcludedExts = false;
+  }
+
+  public String getExcludedExts() {
+    StringBuffer sb    = new StringBuffer();
+    Iterator     iter  = excludedExts.iterator();
+    boolean      first = true;
+
+    while(iter.hasNext()) {
+      if(first) {
+        sb.append((String)iter.next());
+        first = false;
+      }
+      sb.append(",");
+      sb.append((String)iter.next());
+    }
+
+    return sb.toString();
+  }
+
+  public String getIncludedExts() {
+    StringBuffer sb    = new StringBuffer();
+    Iterator     iter  = includedExts.iterator();
+    boolean      first = true;
+
+    while(iter.hasNext()) {
+      if(first) {
+        sb.append((String)iter.next());
+        first = false;
+      }
+      sb.append(",");
+      sb.append((String)iter.next());
+    }
+
+    return sb.toString();
+  }
+
+  public boolean isMultipart(HttpServletRequest req) {
+    return MultipartUtil.isMultipartFormData(req);
+  }
+
+  public void process(HttpServletRequest req,
+                      List               monitors,
+                      String             encoding,
+                      int                maxFileSize)
+      throws UploadException,
+             IOException {
+    this.monitors = monitors;
+    data = new 
UploadMultipartData(req,monitors,UploadConstant.DEFAULT_ENCODING,UploadConstant.MAX_FILE_SIZE);
+  }
+
+  public Iterator getParameterNames() {
+    return data.getParameterNames();
+  }
+
+  public void clear()
+      throws UploadException,
+             IOException {
+    if(storeType == UploadConstant.DIR && storeLocation != null) {
+      File file = new File(storeLocation + UploadConstant.SEPARATOR);
+
+      if(file.exists()) {
+        if(!file.canWrite()) {
+          throw new UploadException(UploadConstant.READ_ONLY);
+        }
+
+        File files[] = file.listFiles();
+
+        if(files != null) {
+          for(int i = 0; i < files.length; i++) {
+            if(!files[i].delete()) {
+              throw new UploadException(UploadConstant.CANNOT_DELETE);
+            }
+          }
+        }
+
+        setStore(UploadConstant.DIR,storeLocation);
+        history.clear();
+      }
+    } else if(storeType == UploadConstant.ZIP && storeLocation != null) {
+      File file = new File(storeLocation);
+
+      if(!file.delete()) {
+        throw new UploadException(UploadConstant.CANNOT_DELETE);
+      }
+
+      setStore(UploadConstant.ZIP,storeLocation);
+      history.clear();
+    } else if(storeType == UploadConstant.MEM && storeMemory != null) {
+      Iterator iter = storeMemory.iterator();
+      while(iter.hasNext()) {
+        ((MultipartFile)iter.next()).reset();
+      }
+
+      storeMemory.clear();
+      history.clear();
+    }
+  }
+
+  //---------------------- UTILITY METHODS ----------------------
+
+  private void setStore(int    storeType,
+                        String storeLocation) // location null if memory
+      throws UploadException,
+             IOException {
+    if(storeType == UploadConstant.MEM) {
+      this.storeType = storeType;
+    } else if(storeType == UploadConstant.DIR) {
+      this.storeType     = storeType;
+      this.storeLocation = storeLocation;
+      File file          = new File(storeLocation + UploadConstant.SEPARATOR);
+      if(file.exists()) {
+        if(!file.canWrite()) {
+          throw new UploadException(UploadConstant.READ_ONLY);
+        }
+      } else if(!file.mkdirs()) {
+        throw new UploadException(UploadConstant.CANNOT_CREATE);
+      }
+    } else if(storeType == UploadConstant.ZIP) {
+      this.storeType     = storeType;
+      this.storeLocation = storeLocation;
+      File file          = new File(storeLocation);
+      this.storeLocation  = storeLocation;
+      if(!file.exists()) {
+        FileOutputStream fos = new FileOutputStream(storeLocation);
+        ZipOutputStream zos = new ZipOutputStream(fos);
+        zos.putNextEntry(new ZipEntry(UploadConstant.BLANK));
+        zos.closeEntry();
+        zos.close();
+        fos.close();
+      }
+    } else {
+      throw new UploadException(UploadConstant.NONEXISTING_TYPE);
+    }
+  }
+
+  private void setStoreTmpDir(String tmpPath) {
+    if(tmpPath != null) {
+      File file = new File(tmpPath);
+
+      if(!file.exists()) {
+        file.mkdirs();
+      }
+    }
+  }
+
+  private boolean checkIncludedExts(String fileName) {
+    boolean included = false;
+    Iterator iter     = includedExts.iterator();
+    int      i        = fileName.lastIndexOf(".");
+    String   extFile  = null;
+    if(i != -1) {
+      extFile  = fileName.substring(i + 1, fileName.length());
+      while(iter.hasNext()) {
+        String ext = (String)iter.next();
+        if(ext.equalsIgnoreCase(extFile)) {
+          return included = true;
+        }
+      }
+    } else {
+      return included = false;
+    }
+    return included = false;
+  }
+
+  private void folder(MultipartFile uploadFile)
+      throws UploadException,
+             IOException {
+    if(uploadFile != null &&
+       uploadFile.getName() != null &&
+       !uploadFile.getName().equals("") &&
+       uploadFile.getSize() >= 0L) {
+      if(uploadFile.getSize() > maxFileSize) {
+        throw new 
UploadException(UploadConstant.UPLOAD_FILE_SIZE_LIMIT_REACHED + " " + 
uploadFile.getName());
+      }
+
+      File    directory     = new File(getStoreLocation() + 
UploadConstant.SEPARATOR);
+      File    files[]       = directory.listFiles();
+      int     numberOfFiles = files.length;
+      boolean isSameName    = false;
+
+      for(int j = 0; j < numberOfFiles; j++) {
+        if(files[j].getName().equals(uploadFile.getName())) {
+          isSameName = true;
+        }
+      }
+
+      if(maxFileNumber == -1 || numberOfFiles < maxFileNumber) {
+        if(extBarred(uploadFile.getName())) {
+          throw new UploadException(UploadConstant.UPLOAD_FILENAME_DENIED + " 
" + uploadFile.getName());
+        }
+
+        FileOutputStream fos             = null;
+        String           uploadFileName  = null;
+
+        if(!isSameName) {
+          fos = new FileOutputStream(getStoreLocation() + 
UploadConstant.SEPARATOR + uploadFile.getName());
+        } else if(!overwrite) {
+          uploadFileName = uploadFile.getName() + ".overwrite." + new 
Date().getTime();
+          fos = new FileOutputStream(getStoreLocation() + 
UploadConstant.SEPARATOR + uploadFileName);
+        } else {
+          fos = new FileOutputStream(getStoreLocation() + 
UploadConstant.SEPARATOR + uploadFile.getName());
+        }
+
+        InputStream is = uploadFile.getInputStream();
+
+        if(is != null) {
+          byte streamData [] = new byte[UploadConstant.BUFFER_SIZE];
+
+          for(int i = 0; (i = is.read(streamData)) != -1;) {
+            fos.write(streamData, 0, i);
+          }
+        }
+
+        fos.close();
+        is.close();
+        UploadParams uploadParams = new UploadParams(uploadFile.getName(), 
uploadFile.getSize(), uploadFile.getContentType(), 1, storeLocation, 
uploadFileName);
+        history.add(uploadParams);
+        notify(uploadParams, uploadFile);
+      } else {
+        throw new UploadException(UploadConstant.UPLOAD_LIMIT_REACHED);
+      }
+    }
+  }
+
+  private void zip(MultipartFile uploadFile)
+      throws UploadException,
+             IOException {
+    if(uploadFile.getName() != null && !uploadFile.getName().equals("") && 
uploadFile.getSize() >= 0L) {
+      if(uploadFile.getSize() > maxFileSize) {
+        throw new 
UploadException(UploadConstant.UPLOAD_FILE_SIZE_LIMIT_REACHED + " " + 
uploadFile.getName());
+      }
+
+      if(extBarred(uploadFile.getName())) {
+        throw new UploadException(UploadConstant.UPLOAD_FILENAME_DENIED + " " 
+ uploadFile.getName());
+      }
+
+      UploadStore uploadStore   = UploadStore.getInstance();
+      String      s1            = uploadStore.append(storeLocation, 
uploadFile, maxFileNumber, overwrite);
+      UploadParams uploadParams = new UploadParams(uploadFile.getName(), 
uploadFile.getSize(), uploadFile.getContentType(), 3, storeLocation, s1);
+
+      history.add(uploadParams);
+      notify(uploadParams, uploadFile);
+    }
+  }
+
+  private void memory(MultipartFile uploadFile)
+      throws UploadException,
+             IOException {
+    if(uploadFile.getName() != null && !uploadFile.getName().equals("") && 
uploadFile.getSize() >= 0L) {
+      if(uploadFile.getSize() > maxFileSize) {
+        throw new 
UploadException(UploadConstant.UPLOAD_FILE_SIZE_LIMIT_REACHED + " " + 
uploadFile.getName());
+      }
+
+      if(extBarred(uploadFile.getName())) {
+        throw new UploadException(UploadConstant.UPLOAD_FILENAME_DENIED + " " 
+ uploadFile.getName());
+      }
+
+      if(maxFileNumber != -1 && storeMemory.size() >= maxFileNumber) {
+        throw new UploadException(UploadConstant.UPLOAD_LIMIT_REACHED);
+      }
+
+      storeMemory.add(uploadFile);
+      UploadParams uploadParams = new UploadParams(uploadFile.getName(), 
uploadFile.getSize(), uploadFile.getContentType(), 0, UploadConstant.MEMORY, 
null);
+      history.add(uploadParams);
+      notify(uploadParams, uploadFile);
+    }
+  }
+
+  private void notify(UploadParams  uploadParams,
+                      MultipartFile uploadFile) {
+    Iterator iter = monitors.iterator();
+    while(iter.hasNext()) {
+      ((Monitor)iter.next()).notify(uploadParams,uploadFile);
+    }
+  }
+
+  private void setStoreType(int storeType)
+    throws UploadException {
+    if(storeType == UploadConstant.MEM   ||
+       storeType == UploadConstant.DIR   ||
+       storeType == UploadConstant.ZIP) {
+      this.storeType = storeType;
+    } else {
+      throw new UploadException(UploadConstant.NONEXISTING_TYPE);
+    }
+  }
+
+  private boolean extBarred(String fileName) {
+    if(isExcludedExts) {
+      return checkExcludedExts(fileName);
+    }
+    return !checkIncludedExts(fileName);
+  }
+
+  private boolean checkExcludedExts(String fileName) {
+    boolean  excluded = false;
+    Iterator iter     = excludedExts.iterator();
+    int      i        = fileName.lastIndexOf(".");
+    String   extFile  = null;
+    if(i != -1) {
+      extFile  = fileName.substring(i + 1, fileName.length());
+      while(iter.hasNext()) {
+        String ext = (String)iter.next();
+        if(ext.equalsIgnoreCase(extFile)) {
+          return excluded = true;
+        }
+      }
+    } else {
+      return excluded = true;
+    }
+    return excluded;
+  }
+} 
 }}}
 
 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to