使用sun.net.ftp.FtpClient;类的客户端上传文件到FTP服务器
如果执行运行程序,上传后的文件大小是0
如果DEBUG程序,一步一步执行上传后的文件没有问题
这是怎么回事呢。

解决方案 »

  1.   

            
    不大明白,给你一段代码看看有没有帮助//ftp建立连接        
             FtpClient ftpClient=new FtpClient();
            ftpClient.openServer("ftp-ip",21);
            ftpClient.login("用户名","密码");
            ftpClient.binary();
            ftpClient.cd("/test");//进入根目录下的某一个目录
            
            //删除
            ftpClient.ascii();  
            ftpClient.sendServer("DELE test.xml \r\n");
            ftpClient.readServerResponse();
            ftpClient.binary();
            
            //ftp上传本机文件
            InputStream streamHtml = new BufferedInputStream(new FileInputStream(new File("D:/xxx.txt")), 10240);
            TelnetOutputStream tos = ftpClient.put("test.xml");
            int readLength = 0;
            byte[] buf = new byte[1024];        
            while ((readLength = streamHtml.read(buf, 0, 1024)) != -1) {
                tos.write(buf, 0, readLength);
            }
            streamHtml.close();
            tos.close();
            
            //ftp下载
            TelnetInputStream tis = ftpClient.get("tet.txt");
            BufferedOutputStream os = new BufferedOutputStream(new FileOutputStream(new File("D:/test.txt")));
            int readLength = 0;
            byte[] buf = new byte[1024];        
            while ((readLength = tis.read(buf, 0, 1024)) != -1) {
                os.write(buf, 0, readLength);
            }
            tis.close();
            os.close();
            
            //关闭ftp
            ftpClient.closeServer();
      

  2.   

    应该不是的,因为我已经看到这个文件了,只是文件大小为0;另外我用相同的用户用FTP工具上传文件是可以的。
      

  3.   

    你可能对底层的socket通讯不是很了解。
    出现传输文件0字节的问题,有很多,简单说几个:
    比如:比如缓冲区,一个大文件文件要分段发送,分段接受。
    比如:文件长度设置有问题。服务器端接受到数据后和你的文件长度参数不符等等
      

  4.   

    这个是出错的代码
    System.out.println("开始创建远程文件...");
    TelnetOutputStream os = ftpClient.put(remotefilename);
    System.out.println("远程文件创建成功。");
    File file_in = new java.io.File(localfilename);
    FileInputStream is = new FileInputStream(file_in);
    byte[] bytes = new byte[1024];
    int c;
    while ((c = is.read(bytes)) != -1)
    {
    os.write(bytes, 0, c);
    os.flush();
    // try
    // {
    // Thread.currentThread().sleep(1000);
    // }
    // catch (InterruptedException e)
    // {
    // // TODO Auto-generated catch block
    // e.printStackTrace();
    // }
    }
    System.out.println("upload success");
    if(is!=null)
    is.close();
    if(os!=null)
    os.close();
    如果加上上面注释掉的sleep函数又可以了,去掉就不行了。
      

  5.   

    很好理解的嘛,你的flush是需要时间的,这个取决于你的网络传递速度。
    如果去掉了sleep,则很快进入下一次write了。
    你可以把flush放到while外面试试。另外,应该用一个缓冲流的。
      

  6.   


    把flush放到while外面还是不行,缓冲流是什么呢
      

  7.   

    你把flush那一行代码去掉试试
      

  8.   

    while ((c = is.read(bytes)) != -1)
    {
    os.write(bytes, 0, c);
    os.flush();
    }
    os.flush();
    这样不行 while ((c = is.read(bytes)) != -1)
    {
    os.write(bytes, 0, c);
    // os.flush();
    }
    os.flush();
    这样有的可以,有的不行。 while ((c = is.read(bytes)) != -1)
    {
    os.write(bytes, 0, c);
    // os.flush();
    }
    // os.flush();
    这样也是有的可以,有的不行。
      

  9.   

    不是网速的问题,是在局域网的。
    这个暂时解决了,在传完文件之后,在执行一个FTP的cd指令,切换目录到根目录,就没有问题了。
    感觉是和关闭连接和传输的时序有关。