我在ADF
页面中有一个JSF
表格,该表格与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();
}
}
答案 0 :(得分:1)
通过添加以下内容解决了问题:
blobDomain.closeInputStream();
blobDomain.closeOutputStream();
在最后一个语句try
facesContext.responseComplete();
块的末尾
次要变更:
我通过这一行获得outputstream
:outputStream = response.getOutputStream();
相反,我应该使用方法作为参数的outputstream
:
public void downloadSelectedFile(FacesContext facesContext, OutputStream outputStream)