我今天偶然发现了这个问题,让我解释一下这个问题:
我有这个处理大量图像文件的 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;
}