0

ファイルを解析してデータを Google App Engine のデータストアに保存するために、FTP URL からファイルを読み取るコードを書いています。自分の Web サーバーでホストされているテスト ファイルを読み取るときはコードを正常に動作させることができますが、必要なデータ ファイルを読み取ろうとすると FileNotFoundException が発生します。

ブラウザで同じ FTP URL を使用してファイルをダウンロードでき、FileZilla で FTP URL に匿名で接続できるため、アクセスに問題はなく、ファイルは間違いなく存在します。これはかなり大きなファイルですが、同じ FTP サーバーから小さなファイルを取得しようとしましたが、うまくいきませんでした。

現時点で持っているコードは次のとおりです。

public void doGet(HttpServletRequest req,
        HttpServletResponse resp) throws IOException, ServletException {

    // works with a URL to my own server & a test.zip, but not this one
    final URL url = new URL(
        "ftp://gisftp.metc.state.mn.us/google_transit.zip");

    // without the privileged action, I get an AccessControlException
    ZipInputStream zin = AccessController.doPrivileged(
        new PrivilegedAction<ZipInputStream>() {
            public ZipInputStream run() {
                return getZipStream(url);
            }
        }
    );

    ZipEntry zipentry = zin.getNextEntry();

    // processing files here

    zin.close();
}

// but using the privileged method, we get a FileNotFoundException
public ZipInputStream getZipStream(URL url) {
    ZipInputStream zipin = null;
    try {
        zipin = new ZipInputStream(url.openStream());
    } catch (IOException e) {
        e.printStackTrace();
    }
    return zipin;
}

最初は AccessControlException を取得していましたが、PrivilegedAction を使用してストリームを開くと、それが修正されるようです。

ファイルが保存されているサーバーにアクセスできないため、そこで何も変更できません。

4

1 に答える 1

1

App Engine から接続できるポートに制限があり、FTP (21) がリストにないため、問題が発生している可能性があります。URL Fetch のドキュメントから;

アプリは、HTTP (通常) または HTTPS (セキュア) を使用して URL を取得できます。URL は、使用するスキームを指定します: http://... または https://...

取得する URL には、80 ~ 90、440 ~ 450、1024 ~ 65535 の範囲の任意のポート番号を使用できます。ポートが URL に記載されていない場合、ポートはスキームによって暗示されます: http://... はポート 80、https://... はポート 443 です。

于 2012-06-08T13:50:07.477 に答える