ADF中的下载文件仅适用于第一次



我在JSF页面中有一个ADF表,它与保存用户上传文件的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();
    }
}

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

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

在最后一条语句facesContext.responseComplete(); 之前的try块的末尾

轻微更改:

我是通过这条线得到outputstream的:outputStream = response.getOutputStream();

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

public void downloadSelectedFile(FacesContext facesContext, OutputStream outputStream)

相关内容

  • 没有找到相关文章

最新更新