1

我今天偶然发现了这个问题,让我解释一下这个问题:

我有这个处理大量图像文件的 Java Web 应用程序。它只允许 JPGs 文件(我猜是公司政策......)。文件存储在某个固定位置,上传过程和缩略图生成进展顺利。图片是使用 Java 类显示的,因为公司不想显示路径。

问题是显示的一些图片是暗的;不是全黑,只是比原来上传的文件暗一点。我检查了上传的文件和缩略图,它们看起来不错,根本没有变暗。

这就是事情变得奇怪的地方:我在本地主机上测试,图片显示正确,当我在服务器上测试时,它们看起来很暗。两者之间的唯一区别是在 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 回答