我知道这似乎是一个常见的问题,但我已经在互联网上搜索了很多,尝试了许多不同的教程和方法来解决它。我认为我已经接近成功了,但不确定。此外,我正在使用Play框架,但Java应该也是一样的。 以下是我的错误信息:
javax.image.IIOException: I/O error reading PNG header!
at com.sun.plugins.png.PNGImageReader.readHeader(Unknown Source)
...
...
Caused by: java.io.EOFException
at javax.imageio.stream.ImageInputStreamImpl.readFully(Unknown Source)
...
以下是我的代码,其中我从表单中获取图片等内容,并将图像转换为字节数组并存储在 MS SQL 数据库中。
@Transactional
public static Result submitTrailer(){
filledForm = newTrailerForm.bindFromRequest();
MultipartFormData body = request().body().asMultipartFormData();
FilePart picture = body.getFile("file");
String fileName = picture.getFilename();
System.out.println(fileName);
String contentType = picture.getContentType();
System.out.println(contentType);
final File file = picture.getFile();
filledForm.get().setContentType(contentType);
try{
BufferedImage originalImage = ImageIO.read(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(originalImage, contentType, baos);
filledForm.get().setImage(baos.toByteArray());
baos.flush();
baos.close();
filledForm.get().save();
}catch(IOException e){
e.printStackTrace();
}
return ok(views.html.index.index.render());
}
这里我正在尝试将byte[]转换回图像,以便在HTML中显示它。
public File getConvertedPicture(){
File imageFile;
System.out.println("byteToImage() called");
if(getImage()==null){
System.out.println("getByteImage()==null");
return null;
}else{
try{
ByteArrayInputStream bis = new ByteArrayInputStream(getImage());
imageFile=File.createTempFile("pattern", ".suffix");
Iterator<?> readers = ImageIO.getImageReadersByFormatName("PNG");
ImageReader reader = (ImageReader) readers.next();
Object source = bis;
ImageInputStream iis = ImageIO.createImageInputStream(source);
reader.setInput(iis, true);
ImageReadParam param = reader.getDefaultReadParam();
Image image = reader.read(0, param);
BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = bufferedImage.createGraphics();
g2.drawImage(image, null, null);
ImageIO.write(bufferedImage,"PNG", imageFile);
return imageFile;
}
catch(IOException e){
e.printStackTrace();
return null;
}
}
我是初学者,这是我第一次使用play和数据库。如果有什么建议能帮助我使其正常运行将不胜感激。
另外,在我的getConvertedPicture()方法中我需要指定格式类型,是否有任何方式可以避免这种情况,让用户上传他们想要的任何类型的图片。
getImage()
的字节不够。你检查过了吗? - Denys Séguret