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);
}

Bean はセッション スコープにあります。

4

1 に答える 1

4

2回読み込もうとしていますInputStream(1回目はDefaultStreamedContentuploadメソッドのコンストラクターで、2回目はsaveメソッドのコピーループです)。これは不可能です。一度だけ読むことができます。最初にそれを読み込んでから、Beanプロパティとして割り当てて、と保存byte[]の両方で再利用できるようにする必要があります。StreamedContent

Beanプロパティなどの外部リソースを絶対に保持しないようにしてください。該当する場合は、現在のBeanおよびその他のBeanからそれらをすべて削除し、画像のコンテンツをプロパティとして保持するために使用します。InputStreamOutputStreambyte[]

特定のケースでは、次のように修正する必要があります。

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これはApache Commons IOからのものであり、の依存関係であるため、クラスパスにすでに含まれている必要があります<p:fileUpload>

于 2012-12-04T13:55:17.767 に答える