通过ftp零字节错误上传Java文件

时间:2011-08-22 13:44:52

标签: java file-upload ftp

我上传了一个文件到服务器,但文件为空。(大小为零字节)

     int reply;
         ftp.connect(server,215);
         ftp.login(username, Password);
         System.out.println("Connected to " + server + ".");
         System.out.print(ftp.getReplyString());
         reply = ftp.getReplyCode();
         if(!FTPReply.isPositiveCompletion(reply)) {
                ftp.disconnect();
                System.err.println("FTP server refused connection.");
         }
         System.out.println("FTP server connected.");
          ftp.setFileType(FTP.BINARY_FILE_TYPE);
          ftp.enterLocalPassiveMode();

         InputStream input= new FileInputStream(source_file_path);

         ftp.storeFile(dest_dir, input);
         System.out.println(ftp.storeFile(dest_dir, input));
         System.out.println( ftp.getReplyString() );

                            input.close();

                            ftp.logout();

2 个答案:

答案 0 :(得分:1)

查看您的代码我认为您正在使用Jakarta commons net。 如果是真的,试试这个:

ftp.connect(address, port);
boolean ft = ftp.setFileType(FTPClient.BINARY_FILE_TYPE);
if(!ft)
    throw new Exception("Error");
ftp.enterLocalPassiveMode(); or ftp.enterLocalActiveMode();
boolean log = ftp.login(user, password);
//if log == true, then u are logged in
ftp.storeFile(remote, local);

另外,如果你想使用进度条来获得传输进度你可以试试这个方法而不是ftp.storeFile

InputStream stO = new BufferedInputStream(new FileInputStream(file), ftp.getBufferSize());
OutputStream stD = ftp.storeFileStream(file.getName());

                    org.apache.commons.net.io.Util.copyStream(
                    stO,
                    stD,
                    ftp.getBufferSize(),
                    file.length(),
                    new org.apache.commons.net.io.CopyStreamAdapter() 
                    {
                        @Override
                        public void bytesTransferred(long totalBytesTransferred, int bytesTransferred,
                                long streamSize) 
                        {
                            try
                            {
                                pb.setMaximum((int)streamSize);
                                pb.setValue((int)totalBytesTransferred);
                            }
                            catch(Exception ex)
                            {
                                pb.setMaximum(-1);
                            }
                        }
                    });
                    stO.close();
                    stD.close();
                    boolean ok = ftp.completePendingCommand();
                    if(!ok)
                        throw new Exception("ERROR while sending the file");

PS:pb是JProgressBar

答案 1 :(得分:1)

您正在存储文件两次。

ftp.storeFile(dest_dir, input);
System.out.println(ftp.storeFile(dest_dir, input));

由于您没有重新打开输入流,第二次调用storeFile方法时,输入流处于EOF,因此您第二次上传的文件将没有内容,因此覆盖第一个文件。

要打印storeFile的结果,您应该:

Object result = ftp.storeFile(dest_dir, input);
System.out.println(result);