0

アプリケーション内にバンドルされている zip ファイルを返す単純なサーブレットを実装しようとしています (単純なリソース)

そこで、サーバー側で次のメソッドを実装しました。

@GET
@Path("{path}/{zipfile}")
@Produces("application/zip")
public Response getZipFile(
        @PathParam("path") String pathFolder,
        @PathParam("zipfile") String zipFile) IOException {
    String fullPath= String.format("/WEB-INF/repository/%s/%s",
            pathFolder, zipFile);
    String realPath = ServletContextHolder.INSTANCE.getServletContext()
            .getRealPath(fullPath);
    File file = new File(realPath );

     ResponseBuilder response = Response.ok((Object) file);
     return response.build();
}

ブラウザからこのメソッドを呼び出すと、zip ファイルがダウンロードされ、そのサイズはサーバー内の元の zip と同じバイト数になります。

ただし、クライアント側のコードから単純な XMLHttpRequest を使用してこれを呼び出すと、次のようになります。

        var oXHR = new XMLHttpRequest();
        var sUrl = "http://localhost:8080/path/file.zip"
        oXHR.open('GET', sUrl);
        oXHR.responseType = 'application/zip';
        oXHR.send();

Chrome の開発者ツールの [ネットワーク] タブで、コンテンツのサイズが大きくなり、この zip ファイルを処理できないことがわかります (たとえば、JSzip はそれを認識しません)。

私の応答と からの最終応答の間のどこかにあるようorg.glassfish.jersey.servlet.ServletContainerです。余分なバイトが書き込まれるか、ファイルにエンコードが行われます。

お手伝いいただけますか?

よろしく、 マキシム

4

1 に答える 1

0

ajax リクエストを使用すると、ブラウザーは (デフォルトで) テキストを想定し、UTF-8 からデコードしようとします (データが破損します)。を試してみてくださいoXHR.responseType = "arraybuffer";: そうすれば、ブラウザはデータを変更せず、生のコンテンツを提供します (これは になりますoXHR.response)。

このソリューションは IE 6-9 では機能しません: サポートが必要な場合は、JSZip のドキュメントを確認してください: http://stuk.github.io/jszip/documentation/howto/read_zip.html

適切な解決策でない場合は、zip ファイルを (js コードを一切使用せずに) 直接ダウンロードして、問題が js 側にあるのか Java 側にあるのかを確認してください。

于 2014-06-15T19:07:30.603 に答える