【问题标题】:Apache Commons Ftp file uploaded 0 bytesApache Commons Ftp 文件上传 0 字节
【发布时间】:2012-12-11 15:54:00
【问题描述】:

我正在开发一个需要将内容上传到 FTP 的应用程序。 我一直无法使 apache commons 与文件上传一起工作。上传的文件有 0 个字节。我尝试了 ASCII 和二进制模式,结果相同。 这是我的代码

    Log.d("FTP", "Connecting");
    ftpsClient.connect(server,port);


    if(ftpsClient.isConnected())
    {
        Log.d("FTP", "Sending File");
        ftpsClient.login("XXXXXXX", "XXXXXXXX");
        ftpsClient.setFileType(FTP.BINARY_FILE_TYPE);
        InputStream is = new FileInputStream("sdcard/log.txt");
        ftpsClient.storeFile("log.txt", is);
        is.close();
        ftpsClient.logout();
        ftpsClient.disconnect();
    }

我做错了什么?

【问题讨论】:

  • 出于好奇,如果您尝试使用“真正的”FTP 客户端(例如,Linux 上的lftp)将文件上传到该服务器会发生什么?
  • 文件上传没有问题。我正在使用 godaddy ftp 服务器,所以我怀疑它是否存在问题。
  • 尝试调试连接,特别注意PASV命令及其响应:发回服务器的套接字地址是“真实”IP地址还是RFC 1918地址?
  • 如何调试连接?

标签: java android apache ftp


【解决方案1】:

去过那里,做过,看到了完全相同的问题。

之后

ftpsClient.login("XXXXXXX", "XXXXXXXX");

添加

ftpsClient.enterLocalPassiveMode();

为了进一步扩展答案,这里有一个完整的 sn-p 进度:

private class FTPUploadTask extends AsyncTask<AFileDescriptor, Long, Boolean> {

    private static final int bufferSize = 64;
    private boolean isCanceling = false;
    private long fileSize = 0;

    private ProgressDialog pd;

    @Override
    protected void onPreExecute() {
        pd = new ProgressDialog( ThisActivity.this );
        pd.setCancelable( false );
        pd.setMessage( "Uploading something..." );
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setProgress(0);
        pd.setMax(100);
        pd.show();
    }

    @Override
    protected void onProgressUpdate(Long... progress) {
        pd.setProgress( (int)( progress[0] * 100 / fileSize ) );
     }

    private int storeFile( OutputStream out, String local ) {
        try {
            InputStream in = new FileInputStream( local );

            byte[] buffer = new byte[ bufferSize * 1024 ];
            int read;
            int allRead = 0;
            while( ( ( read = in.read( buffer ) ) != - 1 ) && !isCanceling ) {
                allRead += read;
                this.publishProgress( (long) allRead );
                out.write( buffer, 0, read );
            }
            in.close();
            in = null;
            out.flush();
            out.close();
            out = null;
            return allRead;
        } catch( Throwable th ) {
            Log.d( "Error: ", th.getMessage() );
            return -1;
        }
    }

    @Override
    protected Boolean doInBackground( AFileDescriptor... params ) {
        ASubFileDescriptor file = params[0].getDefaultFile();
        FTPClient ftp = new FTPClient();
        try {
            ftp.connect( FTPHostName );
            ftp.login( FTPUser, FTPPass );
            ftp.cwd( FTPTargetFolder );

            ftp.enterLocalPassiveMode();

                            String storeName = file.getStoreName();
            ftp.setFileType( FTP.BINARY_FILE_TYPE );
            this.fileSize =  file.getFile().length();
            OutputStream out = ftp.storeFileStream( storeName );
            int bytes = storeFile( out,
                       file.getFile().getAbsolutePath() );

            ftp.logout();
            ftp.disconnect();
            return bytes > 0;
        } catch( Throwable th ) {
            Log.d( "FTP Error:", th.getMessage() );
            return false;
        }
    }

    @Override
    protected void onPostExecute( Boolean success ) {
        try {
            pd.dismiss();
        } catch( Throwable th ) {

        }

        if( success ) {
                        // do something
        } else {
                        // do something else
    }
}

此 sn-p 用于将某些调试信息上传到本地服务器以获得 2 级支持。根据您使用上传的方式,您可能需要添加更多错误检查/恢复和用户交互。

【讨论】:

  • 非常欢迎。我只是添加了整个位,以防您需要添加上传进度等。
猜你喜欢
  • 2012-01-25
  • 2012-03-20
  • 1970-01-01
  • 2013-06-17
  • 2014-08-09
  • 2011-03-27
  • 2013-10-03
  • 1970-01-01
相关资源
最近更新 更多