jsp 上传文件到两台服务器。

来源:互联网 发布:codevs题 知乎 编辑:程序博客网 时间:2024/05/29 10:06

应用环境:服务器是windows2003。

服务器:两台服务器web服务器和数据库服务器。

实现的目标:在web服务器端进行文件的上传,上传后的文件传输到数据库服务器。

所需条件:在web服务器上要有相应的目录存储文件,假设为:D:\\webroot\\Project\\public\\usertel\\。在数据库服务器上要有一个共享的文件夹,假设命名为ttt,所需jar包:jcifs-1.3.14.jar(网上可以下载找到)。

写一个上传文件的jsp页面:

<%
//检查表单是否正确
boolean isMultipart = FileUpload.isMultipartContent(request);
      DiskFileItemFactory factory = new DiskFileItemFactory();
      ServletFileUpload upload = new ServletFileUpload(factory);
      String time1 = new SimpleDateFormat("yyyyMMddhhmmss").format(Calendar.getInstance().getTime());
     
      //文件最大,设为-1表示不受限制
      //upload.setSizeMax(50*1024);
     
      //解析请求,把解析的结果放在一个List里面
      List items = upload.parseRequest(request);
      //缓存大小,设为-1表示不受限制
      factory.setSizeThreshold(4096);
      //设置临时目录
      factory.setRepository(new File("D:\\temp"));
      Iterator iter = items.iterator();

   String dirtemp1 = null;
     
      String c_filename = null;
      String dirtemp = null;
      while(iter.hasNext()){
        FileItem item = (FileItem)iter.next();
        //检查是一个普通的表单域还是File组件
        if(!item.isFormField()){
          File fullFile = new File(item.getName());
          String filepath1="/public/usertel/";
          String filepath = "\\usertel\\";
          String s = request.getContextPath();   
          //System.out.println("s"+s);
          s = s +filepath1;
                   
          String path = application.getRealPath("/").substring(0,application.getRealPath("/").length()) + request.getRequestURI().substring(request.getContextPath().length());                
          //System.out.println(path);
          //String strDirPathttt = new File(pathttt).getParent();//获取upload.jsp页面所在路径。
          String strDirPath = new File(path).getParent();//获取upload.jsp页面所在路径。
          filepath = strDirPath + filepath;
          //System.out.println("路径:"+filepath);
         
          c_filename = fullFile.getName();   
          if(c_filename==null || c_filename.equals("")){
           dirtemp = null;
          }else{        
            c_filename = time1.concat(".xls"); 
            File uploadedFile = new File(filepath,c_filename;       
            dirtemp = s.concat(c_filename);
            //System.out.println(filepath);
           
            dirtemp1 = filepath.concat(c_filename);                
            item.write(uploadedFile);
           
            boolean tag = FileTransfer.Transferable(c_filename);//******************这是调用的将文件传到数据库服务器的方法。
            if(tag==true){
                 System.out.println("上传成功");
                }
           }
          
        }
}
     
  
%>

以下是FileTransfer方法(这部分主要是借鉴了他人的用法。):

public class FileTransfer {
private static Logger logger = Logger.getLogger(FileTransfer.class);
private static final int BUFFERED_NUM = 16 * 1024;
public  static boolean Transferable(String filename){
  try {

   String localDir = "D:\\webroot\\Project\\public\\usertel\\"+filename;

   String remoteUrl = "smb://Administrator:password@192.168.9.103/ttt/"+filename;//Administrator是数据库服务器的用户名,password为数据库服务器的密码。
   int offset = 0;
   writeFileToRemote(localDir, remoteUrl, offset);
   System.out.println("-----end");
  } catch (Exception e) {  
   // TODO Auto-generated catch block
   e.printStackTrace();
   return false;
  }
  return true;
}
/**
  * 写文件到远程服务器上。
  *
  * @param localDir
  * @param remoteUrl
  * @param offset
  * @throws IOException
  * @since 0.9
  */
public static void writeFileToRemote(String localDir, String remoteUrl,
   int offset) throws Exception {
  logger.info("---writeFile start....localDir=" + localDir
    + "...remoteUrl=" + remoteUrl + "...offset=" + offset);
  System.out.println(localDir);
  System.out.println(remoteUrl);
  if (remoteUrl == null || remoteUrl.trim().equals("")
    || localDir == null || localDir.trim().equals("")) {
   throw new Exception(
     "---remoteUrl or localDir is null or is nlank!---");
  }

  // 检验要写入文件的文件夹是否存在。检验完后一定存在。
  checkSmbFilePath(remoteUrl);

  String remoteUrlNew = remoteUrl;
  remoteUrl = remoteUrl + ".unimas";

  // 读写文件
  byte buffer[] = new byte[BUFFERED_NUM];
  int readed = 0;
  BufferedInputStream in = null;
  BufferedOutputStream out = null;
  try {
   // println(remoteUrl + "....localDir=" + localDir);
   SmbFile remoteFile = new SmbFile(remoteUrl);
   in = new BufferedInputStream(new FileInputStream(localDir),
     BUFFERED_NUM);
   out = new BufferedOutputStream(new SmbFileOutputStream(remoteFile),
     BUFFERED_NUM);
   if (offset > 0) {
    // 读取不需要的信息。
    in.read(new byte[offset]);
   }

   // 建立smb文件输入流
   while ((readed = in.read(buffer)) != -1) {
    out.write(buffer, 0, readed);
   }
   out.close();
   in.close();
   logger.info("---writeFile end....localDir=" + localDir
     + "...remoteUrl=" + remoteUrl + "...offset=" + offset);

   // TODO 增加换名的操作
   SmbFile remoteFile2 = new SmbFile(remoteUrlNew);
   // 先判断是否存在,若存在,则删除
   if (remoteFile2.exists()) {
    remoteFile2.delete();
   }
   remoteFile.renameTo(remoteFile2);
   logger.info("---rename....old=" + remoteUrl + "...new="
     + remoteUrlNew + "...success!");
   remoteUrl = remoteUrlNew;

  } catch (Exception e) {
   closeBufferedOutputStream(out);
   closeBufferedInputStream(in);
   // 删除远程文件
   SmbFile remoteFile = new SmbFile(remoteUrl);
   if (remoteFile.exists()) {
    remoteFile.delete();
    logger.info("---writeFile fail....localDir=" + localDir
      + "...remoteUrl=" + remoteUrl + "...delete remote!");
   }
   throw e;
  } finally {
   closeBufferedOutputStream(out);
   closeBufferedInputStream(in);
  }
}

/**
  * 关闭缓冲输入流。
  *
  * @param bais
  * @since 1.0
  */
public static void closeBufferedOutputStream(BufferedOutputStream bais) {
  if (bais != null) {
   try {
    bais.close();
   } catch (IOException e) {
    logger.error("close BufferedOutputStream faild");
    logger.error(e);
   }
   bais = null;
  }
}

/**
  * 关闭缓冲流。
  *
  * @param bais
  * @since 1.0
  */
protected static void closeBufferedInputStream(BufferedInputStream bais) {
  if (bais != null) {
   try {
    bais.close();
   } catch (IOException e) {
    logger.error("close BufferedInputStream faild");
    logger.error(e);
   }
   bais = null;
  }

}

public static void checkSmbFilePath(String remoteUrl) throws Exception {
  // 获取给定文件对应的目录
  int temp1 = remoteUrl.lastIndexOf("//");
  int temp2 = remoteUrl.lastIndexOf("/");
  if (temp2 > temp1) {
   temp1 = temp2;
  }
  String path = remoteUrl.substring(0, temp1);
  if (!createFolder(path)) {
   throw new Exception("---" + path + " is not exists---");
  }
}

/**
  * 创建目录。
  *
  * @param parentPath
  *            给定的目录名。
  * @return 已存在或创建成功返回true,否则返回false。
  * @throws MalformedURLException
  * @throws SmbException
  * @since 0.9
  */
private static boolean createFolder(String parentPath)
   throws MalformedURLException, SmbException {
  if (parentPath == null) {
   return false;
  }
  SmbFile path = new SmbFile(parentPath);
  if (!path.exists()) {
   path.mkdirs();
  }
  return true;

}
}

原创粉丝点击