2012-12-04 4 views
0

업로드 된 이미지를 저장하려고 할 때 Stream is closed Exception이 표시됩니다. 업로드하기 전에 미리 저장하려고합니다. graphicImage. 이 작업이 진행 중입니다. 하지만 이미지를 저장할 수 없습니다. 여기 내 코드는 다음과 같습니다.스트림 닫힘 예외

private InputStream in; 
private StreamedContent filePreview; 
// getters and setters 

public void upload(FileUploadEvent event)throws IOException { 
    // Folder Creation for upload and Download 
    File folderForUpload = new File(destination);//for Windows 
    folderForUpload.mkdir(); 
    file = new File(event.getFile().getFileName()); 
    in = event.getFile().getInputstream(); 
    filePreview = new DefaultStreamedContent(in,"image/jpeg"); 
    FacesMessage msg = new FacesMessage("Success! ", event.getFile().getFileName() + " is uploaded."); 
    FacesContext.getCurrentInstance().addMessage(null, msg); 
} 

public void setFilePreview(StreamedContent fileDownload) { 
    this.filePreview = fileDownload; 
} 

public StreamedContent getFilePreview() { 
    return filePreview; 
} 

public void saveCompanyController()throws IOException{ 
    OutputStream out = new FileOutputStream(getFile()); 
    byte buf[] = new byte[1024]; 
    int len; 
    while ((len = in.read(buf)) > 0) 
     out.write(buf, 0, len); 
    FileMasterDO fileMasterDO=new FileMasterDO(); 
    fileMasterDO.setFileName(getFile().getName()); 
    fileMasterDO.setFilePath(destination +file.getName()); 
    fileMasterDO.setUserMasterDO(userMasterService.findUserId(UserBean.getUserId())); 
    fileMasterDO.setUpdateTimeStamp(new Date()); 
    in.close(); 
    out.flush(); 
    out.close(); 
    fileMasterService.save(filemaster); 
} 

빈은 세션 범위에 있습니다.

답변

3

InputStream 두 번 읽으려고합니다. 첫 번째 시간은 업로드 방법의 생성자 DefaultStreamedContent이고 두 번째 시간은 save 메소드의 복사 루프입니다. 이건 불가능 해. 한 번만 읽을 수 있습니다. 먼저 byte[]으로 읽은 다음 bean 등록 정보로 지정해야 StreamedContent과 저장을 위해 다시 사용할 수 있습니다.

하면 결코는 빈 속성으로 InputStream 또는 OutputStream 같은 외부 자원을 보유 있는지 확인합니다. 해당하는 경우 현재 및 다른 bean에서 모두 제거하고 byte[]을 사용하여 이미지의 내용을 특성으로 보유하십시오. 특정 경우

, 당신은 다음과 같이 수정해야합니다

private byte[] bytes; // No getter+setter! 
private StreamedContent filePreview; // Getter only. 

public void upload(FileUploadEvent event) throws IOException { 
    InputStream input = event.getFile().getInputStream(); 

    try { 
     IOUtils.read(input, bytes); 
    } finally { 
     IOUtils.closeQuietly(input); 
    } 

    filePreview = new DefaultStreamedContent(new ByteArrayInputStream(bytes), "image/jpeg"); 
    // ... 
} 

public void saveCompanyController() throws IOException { 
    OutputStream output = new FileOutputStream(getFile()); 

    try { 
     IOUtils.write(bytes, output); 
    } finally { 
     IOUtils.closeQuietly(output); 
    } 

    // ... 
} 

참고 : IOUtils 그것이 <p:fileUpload>의 의존성의 당신이 이미 클래스 경로에 있어야한다 아파치 코 몬즈 IO에서입니다.

+0

나는 데이터베이스에 이미지를 저장하지 않을 것이다. 나는 단지 경로 만 저장해야한다. – Arunprasad

+0

이 댓글과 질문 및 답변의 관계가 확실하지 않습니다. 구체적인 문제를 이해 했습니까? 'InputStream'을 두 번 읽습니다 ('upload()'메쏘드와'saveCompanyController()'메쏘드에서 한번씩). 이건 불가능 해. 한 번만 읽을 수 있습니다. 이것을'byte []'로 읽어 들여 원하는만큼 여러 번 읽고 다시 사용할 수 있습니다. – BalusC

+0

나는 그것을 올바르게 고치는 법에 대한 구체적인 예를 들어 답을 확장했다. – BalusC

관련 문제