2016-05-30 5 views
0

サービスからPNG画像ファイルをレンダリングするときに、Chromeブラウザで "net :: ERR_INCOMPLETE_CHUNKED_ENCODING"という問題が発生することがあります。私は、Webレスポンスをイメージとしてブラウザに返す内部サービスを呼び出しています。これは私のネットワークの外では利用できない内部サービスであるため、ネットワーク外の人に画像を取得するためのミドルウェアとして小さなユーティリティを作成しています(公開ウェブページなど)レスポンスタイプ "画像"のChromeでの問題 - JSP

私は広範囲に検索しましたGoogleとstackoverflowに掲載された記事のほとんどは、問題が特定のケースに重点を置いているか、または一部のウイルス対策ソフトでリアルタイム保護されていることを示唆しています。私のローカルマシン上のアンチウィルスを無効にすると、私のマシン上でのみ問題が解決するかもしれませんが、すべてのユーザーでこの問題は解決されません。

以下は、サービスからイメージを取得し、レスポンスをイメージとしてレンダリングするJSPコードです。すべてのブラウザで正常に動作していますが、クロムで動作しています。

ここで間違っていることを確認してください。

<%@ page language="java"%> 
<%@ page import="java.util.*" %> 
<%@ page import="java.net.*" %> 
<%@page import="java.io.*, java.awt.*, java.awt.image.*,com.sun.image.codec.jpeg.*" %> 
<%@page import="javax.imageio.ImageIO"%><% 
    String SERVICEURL = "http://testservice"; 
String sessionValue = request.getParameter("session") != "" ? request.getParameter("session") : ""; 
String pageValue = request.getParameter("page") != "" ? request.getParameter("page") : ""; 
if(sessionValue != "" && sessionValue != null) { 
    try { 
     String RequestURL = SERVICEURL+"/session/"+sessionValue+"/img?page="+pageValue+"&size=322"; 
     URL u = new URL(RequestURL); 
     BufferedImage img = null; 
     img = ImageIO.read(u); 
     response.setContentType("image/png"); 
     ImageIO.write(img, "png", response.getOutputStream()); 
    } 
    catch(SocketTimeoutException timeoutExp) { 
     out.println("Timeout"); 
    } 
    catch(Exception exp) { 
     out.println(exp); 
    } 
} 
%> 

必要なパラメータでサービスに直接アクセスしようとすると、すべてのブラウザで問題なく動作しています。しかし、上記のミドルウェアコードを使用して同じことをしようとすると、エラーがスローされます。ただし、どちらの場合も、イメージはブラウザでレンダリングされています。サービスから直接画像を呼び出す enter image description here

:この上 enter image description here

任意の提案です

以下

は、参照ミドルウェアユーティリティを使用してイメージを起動

用のスクリーンショットです大いに助けます。 ありがとうございます

+0

ストリーム上で 'ImageIO.write(..)'が 'close()'を呼び出すことによって問題が発生した可能性があります。いずれにしても、このようなイメージデータをコピーするために 'ImageIO'を使用すべきではありません。代わりに、forwardを使うか、 'RequestDispatcher.forward/include'を使います(ユースケースに依存します)。ファイルがサーブレットエンジンで使用できない場合は、バイトごとにファイルをサーブレット出力ストリームにコピーできます。 – haraldK

+0

提案のハーレドに感謝します。私はここでサーブレットを使用していません。操作を行うプレーンなJSPページ。出力ストリームでコンテンツをフラッシュしようとしたとき、それは空のイメージとして現れています。そこで私はImageIOを使用しました。 ImageIOを使用する際の問題は何ですか? – Sriram

+0

JSPはサーブレットにコンパイルされているので、サーブレットを使用しています(ただし、JSPではなくプレーンサーブレットを使用することをお勧めしますが、空白に注意してください)。 :-) 'ImageIO'を使うときの主な問題は、イメージをデコードしてから再びエンコードすることです。これは非常に高価なCPUです、それに加えて、それは品質の低下や大きなファイルサイズなどを引き起こす可能性があります。 – haraldK

答えて

0

ImageIOパッケージを部分的に削除して、Haraldの提案に部分的に従いました。

<%@ page language="java"%><%@ page import="java.net.*" %><%@page import="java.io.*" %><%@page trimDirectiveWhitespaces="true"%><%@page contentType="image/png"%><% 
String SERVICEURL = "http://testservice"; 
String sessionValue = request.getParameter("session") != "" ? request.getParameter("session") : ""; 
String pageValue = request.getParameter("page") != "" ? request.getParameter("page") : ""; 
if(sessionValue != "" && sessionValue != null) { 
    try { 
     String RequestURL = SERVICEURL+"/session/"+sessionValue+"/img?page="+pageValue+"&size=322"; 
     URL u = new URL(RequestURL); 
     URLConnection connection = u.openConnection(); 
     InputStream inStream = connection.getInputStream(); 
     OutputStream outStream = response.getOutputStream(); 
     int i; 
     byte[] buf = new byte[32 * 1024]; 
     while ((i = inStream.read(buf)) != -1) { 
      outStream.write(buf, 0, i); 
     } 
     outStream.flush(); 
     outStream.close(); 
    } 
    catch(SocketTimeoutException timeoutExp) { 
     System.out.println(timeoutExp); 
    } 
    catch(Exception exp) { 
     System.out.println(exp); 
    } 
} 
%>