2017-01-26 4 views
-2

У меня есть проект, основанный на структуре Spring-model-view-controller (MVC) Spring. Версия платформы Spring-model-view-controller (MVC) - 3.2.8. Читаю изображениеЧтение/загрузка изображения

public static void main(String[] args) { 

    BufferedImage img = null; 
    try { 
     img = ImageIO.read(new File("C:/tmp/device.jpg")); 
    } catch (IOException e) { 
    }  
    System.out.println ("img -> " + img); 
} 

и Он работает отлично с этим результатом:

img -> [email protected]: type = 5 ColorModel: #pixelBits = 24 numComponents = 3 color space = [email protected] transparency = 1 has alpha = false isAlphaPre = false ByteInterleavedRaster: width = 480 height = 640 #numDataElements 3 dataOff[0] = 2 

Но когда я загрузить же изображение в моей весна-MVC приложение:

MultipartFile file = productForm.getAttachment(); 

System.out.println ("productForm.getAttachment() ------------------> " + productForm.getAttachment()); 
     System.out.println ("productForm.getAttachment().getContentType() -> " + productForm.getAttachment().getContentType()); 
     System.out.println ("productForm.getAttachment().getSize() --------> " + productForm.getAttachment().getSize()); 

    byte[] result = new byte[(int) file.getSize()]; 
    Image img = new Image(); 
    img.setContent(result); 
    ByteArrayInputStream in = new ByteArrayInputStream(img.getContent()); 
    BufferedImage img2 = null; 
       try { 
        img2 = ImageIO.read(in); 
        System.out.println ("IMAGE CONTENT2 ------> " + img2); 
       } catch (IOException e) { 
       } 

    productForm.getAttachment() ------------------> [email protected]f1bc67 
    productForm.getAttachment().getContentType() -> image/jpeg 
    productForm.getAttachment().getSize() --------> 28704 

, я столкнулся с img2 NULL !!!

Здесь класс Image

public class Image implements java.io.Serializable { 

    private Long id; 
    private byte[] content; 

    public Image() { 
    } 

    public Image(Image image) { 
     this.id = image.getId(); 
     this.content = image.getContent(); 
    } 

    public Image(byte[] content) { 
     this.content = content; 
    } 

    @Id 
    @Column(name = "ID", unique = true, nullable = false, precision = 38, scale = 0) 
    public Long getId() { 
     return this.id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(name = "CONTENT", nullable = false) 
    @Lob 
    @Basic(fetch = FetchType.LAZY) 
    public byte[] getContent() { 
     return this.content; 
    } 

    public void setContent(byte[] content) { 
     this.content = content; 
    } 

} 
+0

Вы проверили, что файл, результат и img не являются нулевыми, чтобы убедиться, что проблема не лежит там. –

+0

Возможно, у вас есть ... 'IOException'? : D – fantaghirocco

+0

Нет, я вижу СОДЕРЖАНИЕ ИЗОБРАЖЕНИЯ2 ------> –

ответ

0

Проблема проста, result массив пуст. Если вы измените код следующим образом, вы, вероятно, должны быть хорошими.

От:

MultipartFile file = productForm.getAttachment(); 
... 
byte[] result = new byte[(int) file.getSize()]; // Bug: Empty array 
Image img = new Image(); 
img.setContent(result); 
ByteArrayInputStream in = new ByteArrayInputStream(img.getContent()); 

To:

MultipartFile file = productForm.getAttachment(); 
... 
byte[] result = file.getBytes(); // Good: The content of the uploaded file 
Image img = new Image(); 
img.setContent(result); 
ByteArrayInputStream in = new ByteArrayInputStream(img.getContent()); 

PS: Я все еще не уверен, что Image класс делает во всем этом, он должен работать так же, как хорошо с просто:

MultipartFile file = productForm.getAttachment(); 
... 
ByteArrayInputStream in = new ByteArrayInputStream(file.getBytes()); 

Или, еще лучше, вы могли бы пройти file.getInputStream() непосредственно ImageIO.read(...), чтобы избежать кэширования содержимого файла в памяти:

MultipartFile file = productForm.getAttachment(); 
... 
InputStream in = file.getInputStream(); 

Все это, если вы не используете img что-то позже, но просто оставил его из вопроса для краткость, конечно.