数据库操作类

来源:互联网 发布:uploadify java开发 编辑:程序博客网 时间:2024/05/04 03:21

package USTC;

import java.util.*;
import java.io.*;
import java.text.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.*;

/**
 *
 * Jakarta commans FileUpload 封装类.
 * 示例代码(在 JSP 页面中, 忽略了异常处理代码):
 * test.htm
 * <br> 〈form action="b.jsp" method="POST" enctype="multipart/form-data"〉
 * <br><!--注意,这个表头的enctype和method是不能随意改变的-->
 * <br>Input name: <input type="text" name="username"><br>
 * Select a file: <input type="file" name="file1"><br>
 * <input type="submit" value="Upload">   </form>
 * b.jsp
 * <br>UploadFile uploadHandler = new UploadFile(request);
 * // 如果是文件上传表单
 * <br>if(uploadHandler.isMultipart()) {
 * <br>String parameterValue = uploadHandler.getParameter("username");// 读取参数
 * <br>UploadFile.saveFileItem(uploadHandler.getFileItem("file1"), new File("c://file1.txt"));  * // 保存文件  }
 * <p>
 * <br>更多参考资料请看 Apache 的网站上的指导文章:
 * <br> Using FileUpload   @link http://jakarta.apache.org/commons/fileupload/using.html
 * <br> @see #getParameter(String)
 * <br> @see #getParameterValues(String)
 * <br> @see #saveFileItem(FileItem, File) * *
 * <br>这个类依赖于 Jakarta commons-fileupload-1.0.zip.
 *  @author 汪征
 *  @version 1.0
 *  2005-03-23 */
public class UploadFile {
  public UploadFile() {
    try {
      jbInit();
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  } /** 文件域列表 */
  private Map fileFields = new TreeMap(); /** 表单域列表 */
  private Map formFields = new TreeMap();

  /** Check that we have a file upload request */
  private boolean isMultipart = false;
  private HttpServletRequest request = null;

  /**  * 空构造器.  */
  //public UploadFile() {}

  /**
   * 根据现有参数构造一个上传处理器.
   * @param request HttpServletRequest
   */
  public UploadFile(HttpServletRequest request) {
    setRequest(request);
  }

  /**  * 设置 HttpServletRequest 并分析里面的表单数据.
   *  @param request - HttpServletRequest  */
  public void setRequest(HttpServletRequest request) {
    this.request = request;
    isMultipart = FileUpload.isMultipartContent(request);
    // 如果是文件上传请求, 就提取里面的参数
    if (isMultipart) { // Create a new file upload handler
      DiskFileUpload upload = new DiskFileUpload();
      try {
// Parse the request
        /* FileItem */
        List items = upload.parseRequest(request);
        // Process the uploaded items
        Iterator iter = items.iterator();
        while (iter.hasNext()) {
          FileItem item = (FileItem) iter.next();
          String name = item.getFieldName();
          String value = item.getString();
          if (item.isFormField()) {
            processFormField(item);
          }
          else {
            processUploadedFile(item);
          }
        }
      }
      catch (Exception ex) {
        System.err.println("无法处理上传数据:" + ex);
      }
    }
  }

  /** 处理表单项目.
   * @param item - FileItem 对象  */
  private void processFormField(FileItem item) {
    String name = item.getFieldName();
    String value = item.getString();
    // 首先尝试获取原来的值
    Object oldValue = formFields.get(name);
    if (oldValue == null) {
      formFields.put(name, value);
    }
    else {
      // 多个值存储为 List
      // 原来为单个值则添加现有的值
      try {
        String oldString = (String) oldValue;
        List list = new ArrayList();
        list.add(oldString);
        list.add(value);
        formFields.put(name, list);
      }
      catch (Exception ex) {
//
        ex.printStackTrace();
      }
      // 原来为多个值则添加现有的值
      try {
        List list = (List) oldValue;
        list.add(value);
        formFields.put(name, list);
      }
      catch (Exception ex) {
//     ex.printStackTrace();
      }
    }
  }

  /**处理文件项目.
   * @param item - FileItem 对象  */
  private void processUploadedFile(FileItem item) {
    String name = item.getFieldName();
    fileFields.put(name, item);
  }

  /** 获取上传的文件项目.FileItem(项目)是这里的关键概念。上传函数就是通过这个FileItem来做为桥梁的
   *  @param name - String, 文件域名称-->即上传表单元素的name属性
   * @return FileItem - org.apache.commons.fileupload.FileItem 对象  */
  public FileItem getFileItem(String name) {
    if (!isMultipart) {
      return null;
    }
    return (FileItem) (fileFields.get(name));
  }

  /** 获取表单参数.(相当与request.getParameter(String name)方法。此方法可以在UploadFile内部实现request的功能,达到了封装的良好目的)
   *  @param name - String, 表单域名称
   * @return String - 表单域值  */
  public String getParameter(String name) {
    if (!isMultipart) {
      return request.getParameter(name);
    }
    Object value = formFields.get(name);
    if (value != null) {
      if (value instanceof String) {
        return (String) value;
      }
    }
    return null;
  }

  /** 获取表单域的多个参数值.
   *  @param name - String, 表单域名称
   * @return String[] - 表单域的多个取值,该方法是getParameter 的扩展*/
  public String[] getParameterValues(String name) {
    if (!isMultipart) {
      return request.getParameterValues(name);
    }
    Object value = formFields.get(name);
    if (value != null) {
      if (value instanceof List) {
        return (String[]) ( (List) value).toArray(new String[0]);
      }
    }
    return null;
  }

  /**
   * 返回当前请求是否为多部分上传请求.
   * @return boolean
   */
  public boolean isMultipart() {
    return isMultipart;
  }

  /**  * 保存 FileItem 对象到指定的文件.
   *  @param item - FileItem, 要保存的上传文件项目
   *  @param filename - String, 要保存到的文件的服务器路径
   * @return boolean - 是否保存成功  */
  public static boolean saveFileItem(FileItem item, String filename) {
    try {
      item.write(new File(filename));
      return true;
    }
    catch (Exception ex) { //
      ex.printStackTrace();
    }
    return false;
  }

  /** 保存 FileItem 对象到指定的文件.
   *  @param item - FileItem, 要保存的上传文件名全路径
   *  @param file - File, 要保存到的文件对象
   *  @return boolean - 是否保存成功  */
  public static InputStream getInputStreamFromFileItem(FileItem item, File file) {
    try {
      return item.getInputStream();
    }

    catch (Exception ex) { //
      ex.printStackTrace();
    }
    return null;
  }

  private void jbInit() throws Exception {
  }

  //JAVA文件上传的实现类
  /**
     * 文件上传的实现类,将源文件名去掉后用时间作为名字存放
     * @param len          request的长度
     * @param contentType  request的内容
     * @param in           request流
     * @return byte[]      上传文件的字节数组
     */
 /*   public byte[] uploadToByte(int len,String contentType,InputStream in)
    {
        String upFile = "";
        try
        {
            byte buffer[] = new byte[len];

            int start = contentType.indexOf("boundary=");
            int boundaryLen = new String("boundary=").length();
            String boundary = contentType.substring(start + boundaryLen);
            boundary = "--" + boundary;

            int total = 0;
            int once = 0;
            while ( (total < len) && (once >= 0))
            {
                once = in.read(buffer, total, len);
                total += once;
            }


            String[] tokens =
                {
                "name=/"", "/"; filename=/"", "/"/r/n", "Content-Type: ",
                "/r/n/r/n"};

            //pos0 记录 boundary 的第一个字节在buffer 中的位置
            int pos0 = byteIndexOf(buffer, boundary, 0);
            int pos1 = 0; //pos1 记录在buffer 中下一个 boundary 的位置
            pos0 += boundaryLen; //记录boundary后面第一个字节的下标
            pos1 = byteIndexOf(buffer, boundary, pos0);
            pos0 += 2; //考虑到boundary后面的 /r/n
            buffer = subBytes(buffer, pos0, pos1 - 2);

            int[] position = new int[tokens.length];
            for (int i = 0; i < tokens.length; i++)
            {
                position[i] = byteIndexOf(buffer, tokens[i], 0);
            }

            //得到字段名
            String name = subBytesString(buffer,
                                         position[0] + bytesLen(tokens[0]),
                                         position[1]);

            //得到文件名
            String filename = subBytesString(buffer,
                                             position[1] + bytesLen(tokens[1]),
                                             position[2]);
            System.out.println("filename=" + filename); //eg:filename="c:/set.sql"

            //上传文件的路径
            int size = 0;

            for (int k = 0; k < filename.length(); k++)
            {
                if (filename.charAt(k) == '//')
                {
                    size = k;
                }
            }
            //System.out.println("the start position is:" + size);

            String myFile = filename.substring(size + 1, filename.length());

//            System.out.println("myFile = " + myFile);
//            int a = myFile.indexOf(".");
//            if (a > 0 )
//                myFile = myFile.substring(a);

//            long ltime = 0L;
//            Date dtime = new Date();
//            ltime = dtime.getTime(); //得到这个标识
//            String stime = ltime+"";//将这个标识转换成一个字符对象
//            //System.out.println("the file name is:" + stime + myFile);
//
//            //String writePath = "c://logs//" + stime + "_" + myFile;
//            //String readPath  = "c://logs//" + stime + "_" + myFile;
//            String writePath = Write_Photo_Path + stime+"_"+myFile;
//            String readPath  = Read_Photo_Path + stime + "_" + myFile;
//            //该文件的名称
//            this.file_name = stime + "_" + myFile;
              //String writePath = Write_Photo_Path +myFile;
              //String readPath  = Read_Photo_Path + myFile;
//            //该文件的名称
              this.file_name = myFile;


            //得到 Content-Type
            String content_Type = subBytesString(buffer,
                                                 position[3] +
                                                 bytesLen(tokens[3]),
                                                 position[4]);
            //System.out.println("content_Type=" + content_Type);

            //得到文件内容
            byte[] b = subBytes(buffer, position[4] + bytesLen(tokens[4]),
                                buffer.length);
            //System.out.println(position[4] + bytesLen(tokens[4]));
            //System.out.println(buffer.length);
            this.bContent = b;//得到文件的BYTE数组
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.println("C:UploadBean;M:uploadToByte()-->" + e.getMessage());
        }
        return this.bContent;
    }

*/

}