ファイルを解析してデータを 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 を使用してストリームを開くと、それが修正されるようです。
ファイルが保存されているサーバーにアクセスできないため、そこで何も変更できません。