2

何かを 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();
    }

私が間違っていることは何ですか?

4

1 に答える 1

5

そこに行って、それを行って、まったく同じ問題を見ました。

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

追加

ftpsClient.enterLocalPassiveMode();

答えを少し拡張するために、進行状況を示す完全なスニペットを次に示します。

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
    }
}

このスニペットは、レベル 2 のサポートのために特定のデバッグ情報をローカル サーバーにアップロードするために使用されます。アップロードの使用方法によっては、エラー チェック/回復とユーザー インタラクションをさらに追加する必要がある場合があります。

于 2012-12-26T03:33:42.967 に答える