现在我有三台机器(假设为A,B,C),A作为部署web项目的服务器,B用来运行一个独立的应用程序(这个应用程序的作用是接收web项目中文件上传时传过来的文件,并进行处理,保存然后通过ftp方式上传到服务器C)  C就是专门存放文件的服务器(也就是文件管理服务器)。现在我遇到的问题是:A的web服务器如何用过jsp页面把客户要上传的文件传到B去进行处理。因为他们是分开的。不在一个web项目下面,而且B保存好文件后如何返回一个url给A,供客户进行再次的访问。小弟在线,请大侠们帮忙。

解决方案 »

  1.   

    使用commons-httpclient和commons-ftp 能解决你的问题。
      

  2.   

    我现在已经实现了ftp的上传和下载,但是我不知道web客户端上传的文件怎么传到这个应用程序里,或者说以什么方式传递。而且我现在是以一台电脑来模拟。
      

  3.   

    如果想自己定义协议用 socket,应用程序监听一个端口号,web用socket连接上去,用流将数据写给应用程序。
      

  4.   

    lz的意思是不是通过A把文件上传到B,然后B在通过ftp上传到c?
    要是这样的话,不知道这样可以。首先B上肯定有接收上传文件的action或者servlet,然后在A上同样也写个接收上传文件的action或servlet,但这个action或servlet有写特殊,主要是获取到相关的参数或者文件流,然后用httpconnection或者apache的httpclient把文件传到B上,然后B把文件的路径print给A
      

  5.   

    用消息队列吧 activeMq来通知b->c的传递文件也可以用saaj 走soap 附件功能实现,不过就不是ftp了还可以搭建个ESB总线的,比如说用Mule
      

  6.   

    我昨晚也想到了4楼给我提供的方法,用socket进行A中web项目与B中文件应用之间的通讯并进行数据的传递。但是我现在还有个问题想请教4楼,我在web中怎么把jsp页面传过来的文件转换成流的形式传给B中的应用呢?或者说我直接传文件不用流的方式传,这样行不行呢?还有就是在A中的socket服务端,怎么传数据给B?为了更清晰,我附上我在web中写的socket服务端,以及我在B中写的FTP上传下载的代码。你给看看如何传递,麻烦大家了,我是新手。socket服务端:
    try {

    Socket socket=new Socket("127.0.0.1",4700);
    //向本机的4700端口发出客户请求
    BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
    //由系统标准输入设备构造BufferedReader对象
    PrintWriter os=new PrintWriter(socket.getOutputStream());
    //由Socket对象得到输出流,并构造PrintWriter对象
    BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    //由Socket对象得到输入流,并构造相应的BufferedReader对象
    String readline;
    readline=sin.readLine(); 
    //从系统标准输入读入一字符串 while(!readline.equals("bye")){    
    //若从标准输入读入的字符串为 "bye"则停止循环

    os.println(readline);              
    //将从系统标准输入读入的字符串输出到Server
    os.flush();                        
    //刷新输出流,使Server马上收到该字符串

          System.out.println("Client:"+readline);    
          //在系统标准输出上打印读入的字符串

      System.out.println("Server:"+is.readLine());   
      //从Server读入一字符串,并打印到标准输出上
          readline=sin.readLine(); 
          //从系统标准输入读入一字符串

    }   //继续循环

           os.close(); //关闭Socket输出流         is.close(); //关闭Socket输入流         socket.close() ; //关闭Socket
    } catch (UnknownHostException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }B中的应用(ftp上传下载):
    public class Ftp { /*
     * 
     * Description: 向FTP服务器上传文件     
     * @Version1.0     
         * @param url FTP服务器hostname     
         * @param port FTP服务器端口     
         * @param username FTP登录账号     
         * @param password FTP登录密码     
         * @param path FTP服务器保存目录     
         * @param filename 上传到FTP服务器上的文件名     
         * @param input 输入流     
         * @return 成功返回true,否则返回false     
         */       
         public static boolean uploadFile(     
                 String url,             //FTP服务器hostname      
                 int port,              //FTP服务器端口     
                String username,        // FTP登录账号      
                String password,       //FTP登录密码     
                String path,           //FTP服务器保存目录     
                String filename,       //上传到FTP服务器上的文件名      
               InputStream input       // 输入流      
                ) {       
            boolean success = false;       
             FTPClient ftp = new FTPClient();       
            try {       
                 int reply;       
                 ftp.connect(url, port);          //连接FTP服务器        
                //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器        
                 ftp.login(username, password);//登录        
                 reply = ftp.getReplyCode();       
                 if (!FTPReply.isPositiveCompletion(reply)) {       
                     ftp.disconnect();       
                     return success;       
               }       
                ftp.changeWorkingDirectory(path);       
                 ftp.storeFile(filename, input);                
                      
                input.close();       
                ftp.logout();       
                success = true;       
             } catch (IOException e) {       
                 e.printStackTrace();       
             } finally {       
               if (ftp.isConnected()) {       
                    try {       
                        ftp.disconnect();       
                    } catch (IOException ioe) {       
                     }       
                 }       
           }       
             return success;       
        } 
         
         /**     
              * Description: 从FTP服务器下载文件     
              * @Version1.0     
              * @param url FTP服务器hostname     
              * @param port FTP服务器端口     
              * @param username FTP登录账号     
              * @param password FTP登录密码     
              * @param remotePath FTP服务器上的相对路径     
              * @param fileName 要下载的文件名     
              * @param localPath 下载后保存到本地的路径     
              * @return     
              */       
             public static boolean downFile(     
                     String url,       //FTP服务器hostname     
                     int port,         //FTP服务器端口     
                     String username, //FTP登录账号     
                     String password, //FTP登录密码     
                     String remotePath,//FTP服务器上的相对路径      
                     String fileName,//要下载的文件名     
                     String localPath//下载后保存到本地的路径     
                     ) {       
                 boolean success = false;       
                 FTPClient ftp = new FTPClient();       
                 try {       
                     int reply;       
                     ftp.connect(url, port);       
                    //如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器        
                     ftp.login(username, password);//登录        
                    reply = ftp.getReplyCode();       
                     if (!FTPReply.isPositiveCompletion(reply)) {       
                        ftp.disconnect();       
                         return success;       
                    }       
                     ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录        
                    FTPFile[] fs = ftp.listFiles();       
                     for(FTPFile ff:fs){       
                         if(ff.getName().equals(fileName)){       
                             File localFile = new File(localPath+"/"+ff.getName());       
                            OutputStream is = new FileOutputStream(localFile);        
                            ftp.retrieveFile(ff.getName(), is);       
                            is.close();       
                         }       
                     }       
                            
                     ftp.logout();       
                     success = true;       
                 } catch (IOException e) {       
                     e.printStackTrace();       
                 } finally {       
                    if (ftp.isConnected()) {       
                         try {       
                             ftp.disconnect();       
                         } catch (IOException ioe) {       
                         }       
                    }       
                 }       
                return success;       
            }    
    }
     同时非常感谢其他几位朋友的热情回帖
      

  7.   

    您好!我现在正在用socket解决这个问题,但是在传递流的过程中出现了一些问题,百度了好久没有找到解决的方法,我QQ是307631123,方便加一下QQ交流一下吗?  问题解决,我可以结贴加分给您,着急中……跪求帮忙!
      

  8.   

    LZ的ftp上传 下载 能兼容所有的IE版本和火狐吗?