servlet upload

     
     package com.zy.oa.util;

import java.io.*;
import java.util.*;
import java.sql.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletException;

/**
 *  该类提供文件上传服务
 */

public class UpLoad{

    private static String newline = "/n";
    private String uploadDirectory = "D:/jakarta-tomcat-4.0.1/webapps/oa/upload";
    private String ContentType = "";
    private String CharacterEncoding = "";
    private String strFileName = "";
    private long iFileSize = 0;
    private Hashtable values = null;
    private Vector fileNames = null;
    private Vector originalFileNames = null;
    private Vector existFileNames = null;
    private String fileText = null;
    private String originalFileText = null;


    public UpLoad(){
        values = new Hashtable();
        fileNames = new Vector();
        originalFileNames = new Vector();
        AttachmentManage manageFileNames = new AttachmentManage();
        Global global = new Global();
        try {
            uploadDirectory = global.getVarValue(Global.UpLoadDir);
        } catch (Exception e) {
            e.printStackTrace();
        }   
    }

    private String getFileName(String s){

        int i = s.lastIndexOf("//");
        if(i < 0 || i >= s.length() - 1){
            i = s.lastIndexOf("/");
            if(i < 0 || i >= s.length() - 1)
                return s;
        }
        strFileName = s.substring(i + 1);
     //   Logger.log(strFileName);
        return s.substring(i + 1);
    }

    public String getUploadFileName(){
        return strFileName;
    }

    public long getFileSize(){
        return iFileSize;
    }

    public void setUploadDirectory(String s){
        uploadDirectory = s;
        Logger.log("上传路径是:" + s);
    }

    public void setContentType(String s){
        ContentType = s;
        int j;
        if((j = ContentType.indexOf("boundary=")) != -1){
            ContentType = ContentType.substring(j + 9);
            ContentType = "--" + ContentType;
        }
    }

    public void setCharacterEncoding(String s){
        CharacterEncoding = s;
    }

    private String getName(String src){
        int i = src.indexOf("name=/"");
        int j = src.lastIndexOf("/"");
        return new String(src.substring(i + 6, j));
    }

    private String getValue(String src){
        return null;
    }

    public Hashtable getValues(){
        return this.values;
    }
    public Vector getFileNames(){
      return this.fileNames;
    }

    public void uploadFile( HttpServletRequest req) throws ServletException,
	IOException{
        //Logger.log(req.getCharacterEncoding());
        //Logger.log(req.getContentType());

        setCharacterEncoding(req.getCharacterEncoding());
        setContentType(req.getContentType());
        uploadFile(req.getInputStream());
    }

    private void uploadFile( ServletInputStream servletinputstream) throws
	ServletException, IOException{

        AttachmentManage manageFileNames = new AttachmentManage();
        existFileNames = manageFileNames.getNameList(this.uploadDirectory);
        String filename = null;
        byte Linebyte[] = new byte[4096];
        int ai[] = new int[1];
        String line= null;
        String fileTextTemp = "";
 //    while((line=readLine(Linebyte, ai, servletinputstream, CharacterEncoding))!=null)
  //    {Logger.log(line);}

      do{
       // 得到文件名
       //如果最后读出的一行包括文件名则直接对这行处理
        if (line != null && line.indexOf("filename=") >= 0){
       //     String aline = "";
        //    aline = new String(line);
            int j = line.indexOf("name=");
            if(j>=0){
              line = line.substring(j + 6);
              fileTextTemp = line.substring(0,line.indexOf("/""));
            }
            int i = line.indexOf("filename=");
            if(i >= 0){
                line = line.substring(i + 10);
                if((i = line.indexOf("/"")) > 0)
                    line = line.substring(0, i);
                break;
            }
         //   int j = aline.indexOf("name=");

         }
        else{
        //读出的最后一行不包括文件名,则继续读取
          while((line = readLine(Linebyte, ai, servletinputstream,
		  CharacterEncoding)) != null){
          //  Logger.log(line);
            //得到文件的name域
            int j = line.indexOf("name=");
            if(j>=0){
              line = line.substring(j + 6);
              fileTextTemp = line.substring(0,line.indexOf("/""));
            }
            int i = line.indexOf("filename=");
            if(i >= 0){
                line = line.substring(i + 10);
                if((i = line.indexOf("/"")) > 0)
                    line = line.substring(0, i);
                break;
            }
          }
        }
      //filename 为文件的路径 和文件名
          filename = line;
      //得到文件名 如果文件名正常 则开始读入上载文件
      if(filename != null && (filename.indexOf("/"") == -1)){
          int Conflict_ID = 0;

          filename = getFileName(filename);
          //保存原始信息
          if(!fileTextTemp.equals("text"))
            this.originalFileNames.add(new String(filename));
          else
            this.originalFileText = filename;

          //如果附件列表中 则改名防止冲突
          if(existFileNames.contains(filename)){
            try{
            Conflict_ID = KeyGenerator.getNewId("Conflict_ID");
            }catch(SQLException e){e.printStackTrace();}
            filename = Conflict_ID + "_" + filename;
          }

      //   如果文件列表中不包含该文件 并且不是正文,则加入
          if(!this.fileNames.contains(filename) && (!fileTextTemp.equals("text")))
            this.fileNames.add(new String(filename));
          else//正文的名字
            fileText = new String(filename);


          String sContentType = readLine(Linebyte, ai, servletinputstream,
		  CharacterEncoding);
          if (sContentType != null)
              if(sContentType.indexOf("Content-Type") >= 0)
                  readLine(Linebyte, ai, servletinputstream, CharacterEncoding);

            File file = null;
            FileOutputStream fileoutputstream = null;

            try{
               file = new File(uploadDirectory, filename);
               fileoutputstream = new FileOutputStream(file);
            }catch(Exception e){e.printStackTrace();}

            String tempStr = readLine(Linebyte, ai, servletinputstream,
			CharacterEncoding);
        //    Logger.log(tempStr);
            //  读上载文件
            while((tempStr != null)&&(tempStr.indexOf(this.ContentType) == -1)){
             //   Logger.log(tempStr);
                fileoutputstream.write(Linebyte, 0, ai[0]);
                tempStr = readLine(Linebyte, ai, servletinputstream,
				CharacterEncoding);
                line = tempStr;
            }//end while
       //     fileoutputstream.flush();
            fileoutputstream.close();
          }//end if
       //   System.out.println("line:" + line);

      }while(line != null);
    }

    private String readLine(byte Linebyte[], int ai[], ServletInputStream
	servletinputstream, String CharacterEncoding){
        try{
            ai[0] = servletinputstream.readLine(Linebyte, 0, Linebyte.length);
            if(ai[0] == -1)
            return null;
        }catch(IOException _ex){
            _ex.printStackTrace();
            return null;
        }

        try{
            if(CharacterEncoding == null){
                //用缺省的编码方式把给定的byte数组转换为字符串
                return new String(Linebyte, 0, ai[0]);
            }else{
                //用给定的编码方式把给定的byte数组转换为字符串
                return new String(Linebyte, 0, ai[0], CharacterEncoding);
            }
        }catch(Exception _ex){
            _ex.printStackTrace();
            return null;
        }
    }
  public String getUploadDirectory() {
    return uploadDirectory;
  }
  public String getFileText() {
    return fileText;
  }
  public Vector getOriginalFileNames() {
    return originalFileNames;
  }
  public String getOriginalFileText() {
    return originalFileText;
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值