如何使用Liferay在portlet中下载文件或InpuStream?

TuGordoBello

我在下载一个方法调用的UI按钮file这需要一个InpuStream类型。这是我的代码

<p:commandButton value="Download" actionListener="#{cc.attrs.noteAndFileBean.downloadFileAttached(noteAndFile)}" />

还有豆

public void downloadFileAttached(final GridFSDBFile noteAndFile)
{
    try
    {
        PortletResponse portletResponse = (PortletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        HttpServletResponse response = PortalUtil.getHttpServletResponse(portletResponse);
        response.setContentType(noteAndFile.getContentType());
        response.setHeader("Content-Disposition", "attachment; filename=\"" + noteAndFile.getFilename());
        response.setHeader("Content-Transfer-Encoding", "binary");
        response.getOutputStream().write(IOUtils.toByteArray(noteAndFile.getInputStream()));
        response.flushBuffer();
    }
    catch (IOException excpetion)
    {
        LOGGER.error("An error occurred downloading the file: " + excpetion.getMessage(), excpetion);
        showMessage(ERROR, "Problemas al descargar el archivo");
    }
}

GridFSDBFile类型是在蒙戈存储文件然后得到一个对象InputStream我电话getInputStream(),然后我把它传给byte array

当我调用此方法时,我收到一个大异常(部分)

Caused by: java.lang.IllegalStateException
    at com.liferay.portal.servlet.filters.gzip.GZipResponse.getWriter(GZipResponse.java:150)
    at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105)
    at com.liferay.portal.kernel.servlet.MetaInfoCacheServletResponse.getWriter(MetaInfoCacheServletResponse.java:315)
    at com.liferay.portlet.MimeResponseImpl.getWriter(MimeResponseImpl.java:102)
    at com.liferay.faces.bridge.context.BridgeContextImpl.getResponseOutputWriter(BridgeContextImpl.java:1197)
    at com.liferay.faces.bridge.context.BridgeContextWrapper.getResponseOutputWriter(BridgeContextWrapper.java:251)
    at com.liferay.faces.bridge.context.ExternalContextCompat_2_0_Impl.getResponseOutputWriter(ExternalContextCompat_2_0_Impl.java:629)
    at com.sun.faces.context.PartialViewContextImpl.createPartialResponseWriter(PartialViewContextImpl.java:429)
    at com.sun.faces.context.PartialViewContextImpl.access$300(PartialViewContextImpl.java:72)
    at com.sun.faces.context.PartialViewContextImpl$DelayedInitPartialResponseWriter.getWrapped(PartialViewContextImpl.java:573)
    at com.liferay.faces.util.context.PartialResponseWriterWrapper.<init>(PartialResponseWriterWrapper.java:31)
    at com.liferay.faces.util.context.PartialViewContextCleanupImpl$PartialResponseWriterCleanupImpl.<init>(PartialViewContextCleanupImpl.java:198)
    at com.liferay.faces.util.context.PartialViewContextCleanupImpl.getPartialResponseWriter(PartialViewContextCleanupImpl.java:177)
    at org.primefaces.context.PrimePartialViewContext.getPartialResponseWriter(PrimePartialViewContext.java:71)
    at com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError(AjaxExceptionHandlerImpl.java:197)
    at com.sun.faces.context.AjaxExceptionHandlerImpl.handle(AjaxExceptionHandlerImpl.java:124)
    at javax.faces.context.ExceptionHandlerWrapper.handle(ExceptionHandlerWrapper.java:97)
    at com.liferay.faces.bridge.context.ExceptionHandlerAjaxImpl.handle(ExceptionHandlerAjaxImpl.java:85)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:119)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
    at com.liferay.faces.bridge.BridgePhaseResourceImpl.execute(BridgePhaseResourceImpl.java:107)
    ... 136 more

如何下载文件?

TuGordoBello

我找到了解决方案,重要的是获取Liferay的ServletResponse并将其以字节数组形式传递给InputStream。

public StreamedContent getDownloadFileStreamContent(final GridFSDBFile noteAndFile)
{
    try
    {
        PortletResponse portletResponse = (PortletResponse) FacesContext.getCurrentInstance().getExternalContext()
                .getResponse();
        HttpServletResponse res = PortalUtil.getHttpServletResponse(portletResponse);
        res.setHeader("Content-Disposition", "attachment; filename=\"" + noteAndFile.getFilename() + "\"");//
        res.setHeader("Content-Transfer-Encoding", "binary");
        res.setContentType(noteAndFile.getContentType());
        res.getOutputStream().write(IOUtils.toByteArray(noteAndFile.getInputStream()));
        res.flushBuffer();

        showMessage(SUCCESS, "Archivo descargado");

    }
    catch (IOException ioe)
    {
        showMessage(ERROR, "Problemas al descargar el archivo");
        LOGGER.error("An error occurred uploading the file: " + ioe.getMessage(), ioe);
    }

    return null;
}

习惯上,我使用素数的成分

<p:commandButton value="Nuevo Download" ajax="false" update="growl">
    <p:fileDownload value="#{cc.attrs.noteAndFileBean.getDownloadFileStreamContent(noteAndFile)}" />
</p:commandButton>

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Selenium在点击事件中下载文件?

来自分类Dev

如何使用phpstorm在ftp中下载文件

来自分类Dev

如何在Watir中下载文件?

来自分类Dev

如何在webView中下载文件?

来自分类Dev

如何在Codeigniter中下载文件?

来自分类Dev

如何在Android中下载文件

来自分类Dev

如何在webView中下载文件?

来自分类Dev

如何允许在 Webview 中下载文件?

来自分类Dev

如何允许在 drupal 中下载文件?

来自分类Dev

使用UpdatePanel从流中下载文件

来自分类Dev

使用JavaScript在Safari中下载文件

来自分类Dev

如何从强制下载的链接中下载文件

来自分类Dev

在SPA中下载文件

来自分类Dev

在Mojolicious中下载文件

来自分类Dev

在DoFn中下载文件

来自分类Dev

在 r 中下载文件

来自分类Dev

如何使用Downloadmanager类在/ databases文件夹中下载文件?

来自分类Dev

wget从文件列表中下载文件,如何为每个下载文件指定名称?

来自分类Dev

如何使用默认名称和类型在Python中下载文件

来自分类Dev

如何不使用chrome.downloads.download在Firefox Webextension中下载文件?

来自分类Dev

如何在jQuery中下载文件(已在hrefDefault中使用preventDefault)?

来自分类Dev

使用硒C#,如何在IE11中下载文件?

来自分类Dev

如何在不使用按钮的情况下开始在vaadin中下载文件?

来自分类Dev

如何使用带有凭据的URL在FilleZilla中下载文件?

来自分类Dev

如何在Spring MVC和MongoDB中下载文件

来自分类Dev

如何在linux / windows中下载文件的子部分?

来自分类Dev

如何在C#中下载文件名?

来自分类Dev

如何从单击按钮的视图中下载文件?

来自分类Dev

如何在laravel 5.4中下载文件

Related 相关文章

热门标签

归档