2011-08-13 13 views
5

ファイルの単純なFTPアクセスの例はどこにも見つからず、FTPClientクラス(いくつかの例が使用しています)はAndroidクラスのインデックスには表示されません。私はhttpアクセスが動作していますが、どうすれば簡単なFTPを入手できますか?私がしたいのは、ダウンロード(例: ftp://tgftp.nws.noaa.gov/data/observations/metar/stations/KABQ.TXT )です。 URLをhttpアクセス方法に指定するだけでは動作しないようです。簡単なftpでAndroid上でファイルを取得する方法

これは時の質問に似ています

StringBuilder response = new StringBuilder(); 
    URLConnection ftpConn; 
    try { 
    URL netUrl = new URL("ftp://tgftp.nws.noaa.gov/data/observations/metar/stations/KABQ.TXT"); 
    ftpConn = netUrl.openConnection(); 
    BufferedInputStream bufRd = new BufferedInputStream(ftpConn.getInputStream()); 
    int temp; 
    while ((temp = bufRd.read()) != -1) { 
     response.append(temp); 
    } 
    bufRd.close(); 
    } catch (Exception e) { 
     return "Failure"; 
    } 

が、それはのgetInputStream上の例外を取得します:私はシンプルにしようとした unable to read file from ftp in android?

サーバーに接続できません:データポートを設定することができません。

また、ストリームバッファからバイトごとにデータを取り出す方が、よりインテリジェントな方法が必要です。私はそれを見つけることができません。

最後に、httpアクセスとftpアクセスの両方を行う必要がありますが、両方のアクセスタイプにURLConnectionを使用しない理由がありますか?または、httpとURLConnectionでHttpConnectionをftpに使用する方が良いですか?

ありがとうございます!

+0

マニフェストでインターネットの使用許可を持っていますか? – Jack

+0

はい、私はその1時間で数時間を費やしました。それは数時間前には良い推測でした。 :-)私はhttpを動作させるが、ftpは動作させない。 –

+1

エミュレータでそのURLをGoogleに入力すると、「Webページが利用できません」と表示され、通常のブラウザにも表示されます。そのURLをブラウザのウィンドウに直接入力すると、50文字しかかからないように見えますが、すべてを取ることはありません。これらのバグはエミュレータにありますか? –

答えて

8

Whew!私はついにそれを得ました。私はwebOSとWPF/C#でftpをやっている簡単な方法をあきらめました:: // ...あなたはFTPClientパッケージを使う必要があります。

ライブラリアクセス(プロジェクト|プロパティ| Javaビルドパス|ライブラリ| JAR追加...)を修正した後、私はそれが動作するまで呼び出されました。ここに私のFTPClient呼び出しのシーケンスがあります。パッシブモードで設定するまでは機能しません。

mFTPClient = new FTPClient(); 
    mFTPClient.connect("tgftp.nws.noaa.gov");  
    mFTPClient.login("anonymous","nobody"); 
    mFTPClient.enterLocalPassiveMode(); 
    mFTPClient.changeWorkingDirectory("/data/forecasts/taf/stations"); 
    InputStream inStream = mFTPClient.retrieveFileStream("KABQ.TXT"); 
    InputStreamReader isr = new InputStreamReader(inStream, "UTF8"); 
+0

同じ呼び出しでディレクトリパスとファイルを組み合わせることができます:InputStream inStream = mFTPClient.retrieveFileStream( "/ data/forecasts/taf/stations/KABQ.TXT"); –

+3

私は使用する必要のある外部ライブラリ.. – Pradeep

+0

私はあなたとまったく同じことをしようとしています。あなたのコードを見ることができますか? – traisjames

2

また、私はウェブ上で「バイトバイバイト」の質問に対する答えをどこかに見つけました。私はまた、サードパーティ製のLIBSの使用せずに、簡単なFTPダウンロードの例を探した

 String theStr = new Scanner(inStream).useDelimiter("\\A").next(); 
1

:これは、直接文字列型へのInputStreamのタイプを変換するために動作するようです。何も見つかりませんでしたので、ここに私の解決策を掲載してください。

デフォルトでは、URLConnectionは、「anonymous」のパスワードとして電子メールを必要とするため、多くのftpサーバーでは受け入れられない空のパスワードでユーザー名「anonymous」を使用します。

アプリで次のコードを使用するには、try..catchを追加して、ストリームからの読み取りがブロックUIスレッドでないことを確認してください。

URL url = new URL("ftp://ftp.mozilla.org/README"); 
URLConnection cn = url.openConnection(); 
cn.setRequestProperty ("Authorization", "Basic " + Base64.encodeToString("anonymous:[email protected]".getBytes(), Base64.DEFAULT)); 

final File dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); 
FileOutputStream fos = new FileOutputStream(dir.getPath() + "/README"); 

InputStream is = cn.getInputStream(); 
int bytesRead = -1; 
byte[] buf = new byte[8096]; 
while ((bytesRead = is.read(buf)) != -1) { 
    fos.write(buf, 0, bytesRead); 
} 
if(is != null)is.close(); 
if(fos != null){ fos.flush(); fos.close(); } 

希望すれば、時間を節約できます。

関連する問題