2012-05-04 7 views
1

今日、この問題に遭遇しました。JavaでのJpgエンコーディング

多くの画像ファイルを扱うJava Webアプリケーションがあります。それはJPGsファイル(会社のポリシー私は推測する...)のみを許可します。ファイルは一定の場所に保存されており、アップロードプロセスとサムネイルの生成はかなりうまく進んでいます。会社がパスを表示しないため、画像はJavaクラスを使用して表示されます。

写真のいくつかは暗いです。すべてが黒ではなく、オリジナルのアップロードファイルより少し暗いです。アップロードされたファイルとサムネイルを確認したところ、見た目はよく見えましたが、まったく暗くはありません。

これは奇妙なことです。localhostでテストしたところ、画像が正しく表示されます。サーバでテストすると、暗く見えます。 2つの唯一の違いは、私がlocalhost上で私はWindows上で動作し、テストサーバはLinuxだということです。両方ともJBOSS 4.2.0を使用します。

<img class="pic" alt="Foto destacada" src="descargarFichero.do?fileName=<c:out value="${foto.nombre}"/>/thumb_<c:out value="${foto.nombre}"/>"/> 

アクション「descargarFichero.do:私はちょうどこれを行う画像を表示する必要があるのJSPに続いて

protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) 
     throws Exception {    

    String ruta = rutaBase + File.separator; 
    String fileName=(String)request.getParameter("fileName"); 

    if (fileName==null) 
     fileName=""; 
    if (!fileName.equals("")) { 
     RemoteFileClient oRemoteFileClient = new RemoteFileClient(); 
     ServletOutputStream output = response.getOutputStream(); 
     if (oRemoteFileClient.isAlive()) { 
      String file2download=ruta+fileName; 
      byte[] contenido=oRemoteFileClient.downloadFile(file2download);     
      if (contenido!=null) { 
       String myContentType=""; 
       boolean isImage=false; 
       String nombreFichero = fileName.toLowerCase(); 
       String extension = nombreFichero.substring(nombreFichero.lastIndexOf(".")+1); 
       if (extension.equals("jpg") || 
        extension.equals("jpeg") || 
        extension.equals("JPG") || 
        extension.equals("JPEG")) { 
        myContentType="image/jpeg"; 
        isImage=true; 
       } 
       else if (extension.equals("gif") || extension.equals("GIF")) { 
        myContentType="image/gif"; 
        isImage=true; 
       } 
       else if (extension.equals("png") || extension.equals("PNG")) { 
        myContentType="image/png"; 
        isImage=true; 
       } 
       else if (extension.equals("doc") || extension.equals("DOC") || 
          extension.equals("rtf") || extension.equals("RTF")) { 
        myContentType="application/msword"; 
       } 
       else if (extension.equals("bin") || 
          extension.equals("exe")) { 
        myContentType="application/octet-stream"; 
       } 
       else if (extension.equals("zip")) { 
        myContentType="application/x-zip"; 
       } 
       else if (extension.equals("pdf")) { 
        myContentType="application/pdf"; 
       } 
       else if (extension.equals("txt")) { 
        myContentType="text/plain"; 
       } 
       else if (extension.equals("xls")) { 
        myContentType="application/ms-excel"; 
       } 
       else if (extension.equals("ppt")) { 
        myContentType="application/ms-powerpoint"; 
       } 
       response.setContentType(myContentType); 
       if (isImage) { 
        BufferedImage im = ImageIO.read(new ByteArrayInputStream(contenido));       
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output); 
        //JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(im); 
        //param.setQuality(1.0f,true); 
        //encoder.encode(im, param); 
        encoder.encode(im); 
       } else { 
        output.write(contenido); 
       } 
       output.flush(); 
       output.close(); 
      } 
     } 
     else{ 
      output.println("No se puede conectar con el servidor de archivos<br>"); 
     } 
    } 

    return null; 
} 

、:

この

は、トリックを行う方法であり、 "私が掲示したメソッドを呼び出します。

私の野生の推測では、JPGエンコーディングに問題がありますが、私はこれらのことについてあまり知らないので、喜んであなたの提案を聞いています。

写真の一部が暗くなっていて、すべてではないことを覚えておいてください。問題のあるファイルを探していますが、疑わしいものはまだ見つかりませんでした。

ありがとうございました

P.S.私はJPG再エンコード部分をスキップし、それがうまく働いた

... 
response.setContentType(myContentType); 
BufferedImage im = ImageIO.read(new ByteArrayInputStream(contenido));       
output.write(contenido); 
output.flush(); 
output.close(); 
... 

:もう一つの方法は、あなたが@EJPと@GuillaumePoletのアドバイスに従い

public byte[] downloadFile(String filename) { 
    byte downloadfile[] = null; 
    try { 
     byte buffer[]; 
     File file = new File(filename); 
     if(file.exists() || (!file.isDirectory())) { 
      buffer = new byte[(int)file.length()]; 
      BufferedInputStream input = new BufferedInputStream(new FileInputStream(filename)); 
      input.read(buffer, 0, buffer.length); 
      input.close(); 
      downloadfile = buffer; 
     } else { 
      //break MISSING_BLOCK_LABEL_65; 
      return null; 
     } 
    } catch(Exception exception) { 
     //System.out.println("FileImpl: " + e.getMessage()); 
     exception.printStackTrace(); 
     return null; 
    } 
    return downloadfile; 
} 
+0

ファイルをそのまま返さない理由は何ですか?最新のブラウザーはすべてgif、jpg、pngを処理できます。だからあなたのサーブレットにjpgとしてそれらを再エンコードするためにそれらをロードするのですか? –

+1

サイドノート:最初の2つの 'if'を' if(fileName!= null) 'で直接置き換えることができます。 'fileName.toLowerCase()'を使うと、文字列が 'jpg || 'と等しいかどうかを調べる必要はありません。 JPG'のみになりますが、 'jpg'にのみ適用されます。 – sp00m

+0

おそらく、それはネットワーク上の接続の問題ですか?あなたはそれが理由であるかどうかを確認するためにテストを実行しましたか? – Thihara

答えて

0

を必要とするかもしれない、私はこれをしませんでした。また、他のコメントの提案を使っていくつかの醜いコードを修正しました(私が直面していた問題に本当に関係していないので、ここに投稿しません)。

あなたの貢献に感謝します!

関連する問題