我在JSF
页面中有一个ADF
表,它与保存用户上传文件的View Object
绑定。该View Object
包含下载像blob domain
、file type
和file 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)