jspsmartUpload支持多个文件上传的

解决方案 »

  1.   

    package com.upload;
    import java.io.*;
    import java.util.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    /**
     *
     * Title: 文件上載類
     * Description: 既能対文件上載、又能取得輸入框的値,最多可同時上伝255个文件
     * Copyright: Copyright (c) 2002
     * Company: Tekson
     * @author 莫?
     * @version 1.0
     */
    public class MoqUploadBean {
      private String[] sourceFile = new String[255];     //源文件名
      private String[] suffix = new String[255];         //文件后墜名
      private String canSuffix = ".gif.jpg.jpeg.png";    //可上伝的文件后墜名
      private String objectPath = "c:/";                 //目標文件目緑
      private String[] objectFileName = new String[255]; //目標文件名
      private ServletInputStream sis = null;             //輸入流
      private String[] description = new String[255];    //描述状太
      private long size = 100 * 1024;                    //限制大小
      private int count = 0;                             //已伝輸文件数目
      private byte[] b = new byte[4096];                 //字節流存放数組
      private boolean successful = true;
      private Hashtable fields = new Hashtable();
      public MoqUploadBean() {
      }
      //設置上伝文件的后墜名
      public void setSuffix(String canSuffix) {
        this.canSuffix = canSuffix;
      }
      //設置文件保存路径
      public void setObjectPath(String objectPath) {
        this.objectPath = objectPath;
      }
      //設置文件保存大小
      public void setSize(long maxSize) {
        this.size = maxSize;
      }
      //文件上伝処理程序
      public void setSourceFile(HttpServletRequest request) throws IOException {
        sis = request.getInputStream();
        int a = 0;
        int k = 0;
        String s = "";
        while ( (a = sis.readLine(b, 0, b.length)) != -1) {
          s = new String(b, 0, a);
          if ( (k = s.indexOf("filename=\"")) != -1) {
            // 取得文件数据
            s = s.substring(k + 10);
            k = s.indexOf("\"");
            s = s.substring(0, k);
            sourceFile[count] = s;
            k = s.lastIndexOf(".");
            suffix[count] = s.substring(k + 1);
            if (canTransfer(count)) {
              transferFile(count);
            }
            ++count;
          } else if ( (k = s.indexOf("name=\"")) != -1) {
            // 普通表単輸入元素,獲取輸入元素名字
            String fieldName = s.substring(k+6, s.length()-3);
            sis.readLine(b, 0, b.length);
            StringBuffer fieldValue = new StringBuffer(b.length);
            while ( (a = sis.readLine(b, 0, b.length)) != -1) {
              s = new String(b, 0, a-2);
              if ( (b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) && (b[4] == 45)) {
                break;
              } else {
                fieldValue.append(s);
              }
            }
            fields.put(fieldName, fieldValue.toString());
          }
          if (!successful)
            break;
        }
      }
      //取得表単元素値
      public String getFieldValue(String fieldName) {
        if (fields == null || fieldName == null) {
          return null;
        }
        return (String) fields.get(fieldName);
      }
      //取得上伝文件数
      public int getCount() {
        return count;
      }
      //取得目標路径
      public String getObjectPath() {
        return objectPath;
      }
      //取得源文件名
      public String[] getSourceFile() {
        return sourceFile;
      }
      //取得目標文件名
      public String[] getObjectFileName() {
        return objectFileName;
      }
      //取得上伝状太描述
      public String[] getDescription() {
        return description;
      }
      //判断上伝文件的類型
      private boolean canTransfer(int i) {
        suffix[i] = suffix[i].toLowerCase();
        //遮个是用来上伝図片的,各位可以把后墜名改掉或者不要遮个条件
        if (sourceFile[i].equals("") || (!(canSuffix.indexOf("."+suffix[i])>=0))) {
          description[i] = "ERR: File suffix is wrong.";
          return false;
        }
        else {
          return true;
        }
      }
      //上伝文件転還
      private void transferFile(int i) {
        String x = Long.toString(new java.util.Date().getTime());
        try {
          objectFileName[i] = x + "." + suffix[i];
          FileOutputStream out = new FileOutputStream(objectPath + objectFileName[i]);
          int a = 0;
          int k = 0;
          long hastransfered = 0; //標示已京伝輸的字節数
          String s = "";
          while ( (a = sis.readLine(b, 0, b.length)) != -1) {
            s = new String(b, 0, a);
            if ( (k = s.indexOf("Content-Type:")) != -1) {
              break;
            }
          }
          sis.readLine(b, 0, b.length);
          while ( (a = sis.readLine(b, 0, b.length)) != -1) {
            s = new String(b, 0, a);
            if ( (b[0] == 45) && (b[1] == 45) && (b[2] == 45) && (b[3] == 45) && (b[4] == 45)) {
              break;
            }
            out.write(b, 0, a);
            hastransfered += a;
            if (hastransfered >= size) {
              description[count] = "ERR: The file " + sourceFile[count] +
                  " is too large to transfer. The whole process is interrupted.";
              successful = false;
              break;
            }
          }
          if (successful) {
            description[count] = "Right: The file " + sourceFile[count] +
                " has been transfered successfully.";
          }
          out.close();
          if (!successful) {
            sis.close();
            File tmp = new File(objectPath + objectFileName[count]);
            tmp.delete();
          }
        }
        catch (IOException ioe) {
          description[i] = ioe.toString();
        }
      }
      public static void main(String[] args) {
        System.out.println("Test OK");
      }
    }
      

  2.   

    一楼的方法不错,jspsmart很方便