ADF中的下载文件仅适用于首次使用

时间:2014-03-17 07:57:04

标签: java jsf oracle11g download oracle-adf

我在ADF页面中有一个JSF表格,该表格与View Object绑定,用于保存用户上传的文件。此View Object包含下载blob domainfile typefile name等文件所需的所有信息。每行都有一个下载按钮,用户可以下载所选文件。

每件事情都是第一次完美无缺。问题是当用户按下他/她已下载的某个文件的下载按钮时,文件被破坏。该文件出现在浏览器的下载部分,但当我尝试打开时,它告诉该文件无法打开,因为不支持文件格式或文件扩展名。

此处是JSF页面中的按钮:

<af:column id="c31">
<af:commandButton text="Download" id="cb12" partialSubmit="true">
      <af:fileDownloadActionListener method="#{ITDetalisBean.downloadSelectedFile}"
         filename="#{row.FileName}" contentType="#{row.FileType}"/>
</af:commandButton>
</af:column>

如您所见,该按钮位于<af:column>标记中。因此,对于每个文件行,都有相应的下载按钮。

以下是Bean方法:

    public void downloadSelectedFile(FacesContext facesContext, OutputStream outputStream) 
{
    // get the view object from the application module
    AppModuleImpl appM = (AppModuleImpl)(JSFUtils.getApplicationModule("AppModuleDataControl"));
    ViewObject fileUploadedVO = appM.findViewObject("UplodedFilesViewTransient1");

    // get the file content as blob domain from the current row
    BlobDomain blobDomain=(BlobDomain)fileUploadedVO.getCurrentRow().getAttribute("FileContn");


    // download the file using output stream
    try {
        HttpServletResponse response =
            (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();

        InputStream in = blobDomain.getBinaryStream();
        outputStream = response.getOutputStream();

        byte[] buf = new byte[1024];
        int count;
        while ((count = in.read(buf)) >= 0) {
            outputStream.write(buf, 0, count);
        }

        in.close();
        outputStream.flush();
        outputStream.close();
        facesContext.responseComplete();


    } catch (IOException ex) {
        System.out.println(ex.getMessage());
        ex.printStackTrace();
    } catch (Exception e) {
        System.out.println(e.getMessage());
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:1)

通过添加以下内容解决了问题:

blobDomain.closeInputStream();
blobDomain.closeOutputStream();

在最后一个语句try

之前facesContext.responseComplete();块的末尾

次要变更:

我通过这一行获得outputstreamoutputStream = response.getOutputStream();

相反,我应该使用方法作为参数的outputstream

public void downloadSelectedFile(FacesContext facesContext, OutputStream outputStream)