0

私は、ユーザーからいくつかのデータ項目を取得し、それをすべて zip ファイルに圧縮してサーバーに FTP 送信するアプリケーションを構築しようとしています。プログラムがホストへの接続を拒否することを除いて、圧縮部分は魅力的であり、FTPも同様に機能すると確信しています。

これを解決するためにすべての順列と組み合わせを試しましたが、問題が何であるかを理解できませんでした。Apache Commons のネット ライブラリを含めて、エラーを接続部分にピンポイントで特定できました。一部のコードのみを使用できるように、ほとんどのコードはコメントアウトされています。

私のコードは「package com.example.gis;」です。

import java.io.FileInputStream;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;


public class FTP extends Activity {

public static FTPClient mFTPClient = null;
public String TAG="1234";
public static String a;
public static String b;
//public static int abc=FTP.BINARY_FILE_TYPE; 
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.ftp);

Bundle extras = getIntent().getExtras();
boolean m=ftpConnect("ftp://xxxxxxxxxx.xxx", "username omitted", "password omitted", 21);
if(m==true)
{
    Toast.makeText(this,"FTP Login" , Toast.LENGTH_LONG).show();

a=extras.getString("path");
b=extras.getString("name");
ftpUpload("a", "b", "/test/");
ftpDisconnect();

}
else
    Toast.makeText(this,"Failure to connect" , Toast.LENGTH_LONG).show();
}



public boolean ftpConnect(String host, String username,
        String password, int port)
{
    mFTPClient=new FTPClient();

try {

// connecting to the host
mFTPClient.connect(host, port);

// now check the reply code, if positive mean connection success
if (FTPReply.isPositiveCompletion(mFTPClient.getReplyCode())) {
// login using username & password
boolean status = mFTPClient.login(username, password);
Toast.makeText(this,"Connected as status ="+status, Toast.LENGTH_LONG).show();
/* Set File Transfer Mode
*
* To avoid corruption issue you must specified a correct
* transfer mode, such as ASCII_FILE_TYPE, BINARY_FILE_TYPE,
* EBCDIC_FILE_TYPE .etc. Here, I use BINARY_FILE_TYPE
* for transferring text, image, and compressed files.
*/
mFTPClient.setFileType(abc);

mFTPClient.enterLocalPassiveMode();

return status;
}
} catch(Exception e) {
Log.d(TAG, "Error: could not connect to host " + host );
}

return false;
}

public boolean ftpDisconnect()
{
    try {
        mFTPClient.logout();
        mFTPClient.disconnect();
        return true;
    } catch (Exception e) {
        Log.d(TAG, "Error occurred while disconnecting from ftp server.");
    }

    return false;
}


/**
 * mFTPClient: FTP client connection object (see FTP connection example)
 * srcFilePath: source file path in sdcard
 * desFileName: file name to be stored in FTP server
 * desDirectory: directory path where the file should be upload to
 */
public boolean ftpUpload(String srcFilePath, String desFileName,
                         String desDirectory)
{
    boolean status = false;
    try {
        FileInputStream srcFileStream = new FileInputStream(srcFilePath);

        // change working directory to the destination directory
        if (ftpChangeDirectory(desDirectory)) {
            status = mFTPClient.storeFile(desFileName, srcFileStream);
        }

        srcFileStream.close();
        return status;
    } catch (Exception e) {
        Log.d(TAG, "upload failed");
    }

    return status;
}


}

かなり長い間、これについて頭を悩ませてきました。

4

1 に答える 1

0
boolean m=ftpConnect("ftp://xxxxxxxxxx.xxx", ...

ftp:// でプロトコルを指定しています。あなたはそれをするべきではありません。「ftp.mycompany.com」のようにサーバー (またはホスト) を指定するだけです。

さらに、接続しようとすると、SocketException、UnknownHostException、および IOException を個別にキャッチする必要があります。スタックトレースを出力すると、エラーの原因がわかります。私はあなたがそうしていないように見えます。

最後の発言として、このインターネット アクセスはメイン スレッドで行っているようです。私はそれが ftp で可能であることを知っています (なぜ ftp であり、http ではないのですか?) が、スレッドまたは asynctask を使用することをお勧めします。

于 2012-12-10T19:46:38.513 に答える