1

今日、この問題に出くわしました。問題を説明しましょう。

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

問題は、表示されている写真の一部が暗いことです。すべてが黒というわけではなく、アップロードされた元のファイルよりも少し暗いだけです。アップロードされたファイルとサムネイルを確認しましたが、見栄えがよく、まったく暗くなっていません。

これが奇妙なところです。ローカルホストでテストしたところ、画像は正しく表示されますが、サーバーでテストすると暗く見えます。この 2 つの唯一の違いは、localhost では Windows で作業し、テスト サーバーは Linux であるということです。どちらもJBOSS 4.2.0を使用しています。

これはトリックを行うメソッドです:

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;
}

次に、画像を表示する必要がある JSP で、次のようにします。

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

アクション「descargarFichero.do」は、投稿したメソッドを呼び出します。

私の勝手な推測では、JPG エンコーディングに何らかの問題があると思われますが、私はこれらのことについてあまり知らないので、あなたの提案を喜んで聞きます (読みます)。

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

どうもありがとう

PSあなたが必要とするかもしれない別の方法

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;
}
4

1 に答える 1

0

@EJP と @GuillaumePolet のアドバイスに従って、私はこれを行いました:

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

JPG の再エンコード部分をスキップしたところ、問題なく動作しました。また、他のコメントの提案を使用していくつかの醜いコードを修正しました (私が直面していた問題とは実際には関係がないため、ここには投稿しません)。

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

于 2012-05-07T10:22:01.883 に答える