GAEから外部ZIPを読み込み操作

96 views
Skip to first unread message

GoodiesX

unread,
Apr 18, 2011, 1:04:15 PM4/18/11
to Google-App-Engine-Japan
お世話になっております。

Servletからの他のwebサーバのzipファイルを読み込んで
zip内のファイルを解析したいと考えております。

zipエントリの名前がasciiのみの場合は問題ありませんが、
zipエントリの名前にマルチバイトの文字列が入っていると、
以下のエラーが発生します。

java.lang.IllegalArgumentException
at java.util.zip.ZipInputStream.getUTF8String(Unknown Source)
at java.util.zip.ZipInputStream.getFileName(Unknown Source)
at java.util.zip.ZipInputStream.readLOC(Unknown Source)
at java.util.zip.ZipInputStream.getNextEntry(Unknown Source)
・・・

調べたところ、
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4820807
のjavaの問題のようです。
FileOutputStreamを使えれば解決できそうですが、
GAEでは使えないようなので、
何かよい方法はないでしょうか。

以下、テストServletとなります。
-----------------
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class Test extends HttpServlet {

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

URL url = new URL("http://localhost/test.zip");
HttpURLConnection http = (HttpURLConnection) url.openConnection();
http.setRequestMethod("GET");
http.connect();
InputStream csvin = http.getInputStream();
ZipInputStream zips = new ZipInputStream(csvin);
ZipEntry ze = zips.getNextEntry(); // ここで
java.lang.IllegalArgumentException発生
for (; ze != null; ze = zips.getNextEntry()) {
if (ze.isDirectory()) {
continue;
}
// ファイル操作
}
csvin.close();
zips.close();
http.disconnect();
}
}
-----------------

以上、よろしくお願いします。

大橋啓介

unread,
Apr 19, 2011, 9:18:24 PM4/19/11
to google-app-...@googlegroups.com
お疲れ様です。
大橋(soundTricker)と申します。

apacheのcommons-compressを利用してはいかがでしょうか?
一応僕が使っている環境では問題なさそうです。
マルチバイト文字も対応しているはずです。

※ちょっと出先なので、コードが出せません。申し訳ないです。

2011年4月19日2:04 GoodiesX <good...@gmail.com>:

> --
> このメールは Google グループのグループ「Google-App-Engine-Japan」の登録者に送られています。
> このグループに投稿するには、google-app-...@googlegroups.com にメールを送信してください。
> このグループから退会するには、google-app-engine...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/google-app-engine-japan?hl=ja からこのグループにアクセスしてください。
>
>

GoodiesX

unread,
Apr 20, 2011, 12:22:12 PM4/20/11
to Google-App-Engine-Japan
大橋様、返信ありがとうございました。

commons-compressを利用して
ほとんど手を加えることなく
動作することを確認できました。

----------------------
import java.io.*;
import java.net.*;
import javax.servlet.http.*;
import org.apache.commons.compress.archivers.ArchiveEntry;
import
org.apache.commons.compress.archivers.zip.ZipArchiveInputStream;

@SuppressWarnings("serial")
public class Test extends HttpServlet {

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

URL url = new URL("http://localhost/test.zip");
HttpURLConnection http = (HttpURLConnection) url.openConnection();
http.setRequestMethod("GET");
http.connect();
InputStream csvin = http.getInputStream();
ZipArchiveInputStream zips = new ZipArchiveInputStream(csvin);

ArchiveEntry ze = zips.getNextEntry();
for (; ze != null; ze = zips.getNextEntry()) {
if (ze.isDirectory()) {
continue;
}
// ファイル操作
}
csvin.close();
zips.close();
http.disconnect();
}
}
----------------------




On 4月20日, 午前10:18, 大橋啓介 <keisuke.ooha...@gmail.com> wrote:
> お疲れ様です。
> 大橋(soundTricker)と申します。
>
> apacheのcommons-compressを利用してはいかがでしょうか?
> 一応僕が使っている環境では問題なさそうです。
> マルチバイト文字も対応しているはずです。
>
> ※ちょっと出先なので、コードが出せません。申し訳ないです。
>
> 2011年4月19日2:04 GoodiesX <goodi...@gmail.com>:
Reply all
Reply to author
Forward
0 new messages