在 Spring Portlet MVC 架构中提供 PDF - Liferay 6.0.6

发布于 2024-12-23 04:17:18 字数 1890 浏览 1 评论 0原文

我一直在寻找一种通过 Liferay Portal 将 PDF(直接显示)文件发送到浏览器的方法。找到了许多解决方案 - 最流行的解决方案是编写一个 Servlet 来完成这项工作。我已经阅读了 JSR 286 规范中的 Portlet 资源服务,有人可以详细说明 Spring 3.0 Portlet MVC 的内容吗?

<servlet>
    <display-name>DownloadServlet</display-name>
    <servlet-name>DownloadServlet</servlet-name>
    <servlet-class>com.liferay.portal.pdf.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DownloadServlet</servlet-name>
    <url-pattern>/DownloadServlet/*</url-pattern>
</servlet-mapping>

Servlet 包括:

private void downloadServlet(HttpServletRequest req,
            HttpServletResponse resp) throws ServletException, IOException {

        logger.debug(" downloadServlet ::  ");
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        ServletOutputStream op = null;
        try {
            //Something
            pdfContentVO=//getpdf VO here

            String filename = "PDFFILE_"+pdfNumber+".pdf";

            op = resp.getOutputStream();
            resp.setContentType("application/pdf");     
            resp.setHeader("Content-Disposition", "attachment; filename="
                    + filename);
            resp.setContentLength(pdfContentVO.getPdfData().length); 
            System.out.println("pdfcontent"+pdfContentVO.getPdfData());
            op.write(pdfContentVO.getPdfData());
            op.flush();
            op.close();


         } catch(final IOException e) {
            System.out.println ( "IOException." );
            throw e;
        } finally {
            if (bis != null)
            {

                bis.close();
            }
            if (bos != null)
            {
                bos.flush();
                bos.close();
            }
        }

    }

I was looking for a way to send a PDF (direct display) file to the browser through Liferay Portal. Found many solutions - the most popular one being writing a Servlet that does the job. I've read about Portlet Resource Serving in JSR 286 Specification, can someone please elaborate on that for Spring 3.0 Portlet MVC?

<servlet>
    <display-name>DownloadServlet</display-name>
    <servlet-name>DownloadServlet</servlet-name>
    <servlet-class>com.liferay.portal.pdf.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DownloadServlet</servlet-name>
    <url-pattern>/DownloadServlet/*</url-pattern>
</servlet-mapping>

And the Servlet Consists of:

private void downloadServlet(HttpServletRequest req,
            HttpServletResponse resp) throws ServletException, IOException {

        logger.debug(" downloadServlet ::  ");
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        ServletOutputStream op = null;
        try {
            //Something
            pdfContentVO=//getpdf VO here

            String filename = "PDFFILE_"+pdfNumber+".pdf";

            op = resp.getOutputStream();
            resp.setContentType("application/pdf");     
            resp.setHeader("Content-Disposition", "attachment; filename="
                    + filename);
            resp.setContentLength(pdfContentVO.getPdfData().length); 
            System.out.println("pdfcontent"+pdfContentVO.getPdfData());
            op.write(pdfContentVO.getPdfData());
            op.flush();
            op.close();


         } catch(final IOException e) {
            System.out.println ( "IOException." );
            throw e;
        } finally {
            if (bis != null)
            {

                bis.close();
            }
            if (bos != null)
            {
                bos.flush();
                bos.close();
            }
        }

    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

邮友 2024-12-30 04:17:18

我找不到任何有关 Servlet<->Portlet 映射的内容。因此,我使用资源映射通过 Spring Portlet MVC 使用注释发送 pdf。
参考:http://developers.sun.com/ Portalserver/reference/techart/jsr286/jsr286_2.html

在 JSP 中:

    <portlet:resourceURL var="PDFActionURL">
        <portlet:param name="reportType" value="pdf" />
        <portlet:param name="pdfNumber" value="${pdfNumber}" />
    </portlet:resourceURL>
    <input type="button" name="viewPDFButton" value="View PDF" onClick="self.location = '${PDFActionURL}';" />

在 portlet 的 Spring ApplicationContext.xml 中,包括以下内容:

<context:annotation-config />
<context:component-scan base-package="com.xxx" />

定义新控制器:

import java.io.IOException;
import java.io.OutputStream;

import javax.portlet.PortletException;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.portlet.bind.annotation.ResourceMapping;

import com.xxx.pdf.PDFBO;
import com.xxx.PDFDTO;
import com.liferay.portal.kernel.servlet.HttpHeaders;
import com.liferay.portal.kernel.util.ParamUtil;

@Controller("pdfController")
@RequestMapping(value = "view")
public class PDFController {
    private final static Logger LOG = LoggerFactory.getLogger(PDFController.class);

    //This is using Spring 3.0 Annotation Mapping (Spring Portlet MVC Architecture)
    @ResourceMapping
    public void serveResource(ResourceRequest resourceRequest, ResourceResponse res) throws PortletException, IOException {
        LOG.info("In serveResource: ResourceURL");
        String returnType = ParamUtil.getString(resourceRequest, "reportType");
        String pdfNumber = ParamUtil.getString(resourceRequest, "pdfNumber");
        LOG.info("returnType:" + returnType + " pdfNumber:" + pdfNumber);
        String filename = "FILENAME_"+pdfNumber+".pdf";
        // HttpServletRequest request =
        // PortalUtil.getHttpServletRequest(resourceRequest);

        if (returnType != null && returnType.equals("pdf")) {
            try {
                //GET YOUR PDF HERE
                //PDFBO pdfBO = new PDFBO();
                //PDFDTO pdfContentVO = null;
                //pdfContentVO = pdfBO.getPDF(pdfNumber);
                res.setContentType("application/pdf");
                res.addProperty(HttpHeaders.CACHE_CONTROL, "max-age=3600, must-revalidate");
                res.addProperty(HttpHeaders.CONTENT_DISPOSITION,"filename="+ filename);
                //Use this to directly download the file
                //res.addProperty(HttpHeaders.CONTENT_DISPOSITION,"attachment");
                OutputStream out = res.getPortletOutputStream();
                //out.write(pdfContentVO.getPdfData());
                out.write(/*get pdf byte[] Array Here */);
                out.flush();
                out.close();
            } catch (Exception e) {
                LOG.info("Error in " + getClass().getName() + "\n" + e);
            }
        }
    }
}

编辑: 如果您正在使用 Liferay 的早期版本,这是一篇通过 Liferay 实现文件下载/服务的好文章 -

I couldn't find anything on Servlet<->Portlet mapping thing. So I used Resource mapping for sending a pdf with Spring Portlet MVC using annotations.
Ref:http://developers.sun.com/portalserver/reference/techart/jsr286/jsr286_2.html

In JSP:

    <portlet:resourceURL var="PDFActionURL">
        <portlet:param name="reportType" value="pdf" />
        <portlet:param name="pdfNumber" value="${pdfNumber}" />
    </portlet:resourceURL>
    <input type="button" name="viewPDFButton" value="View PDF" onClick="self.location = '${PDFActionURL}';" />

In Spring ApplicationContext.xml of the portlet, include these:

<context:annotation-config />
<context:component-scan base-package="com.xxx" />

Define a new controller:

import java.io.IOException;
import java.io.OutputStream;

import javax.portlet.PortletException;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.portlet.bind.annotation.ResourceMapping;

import com.xxx.pdf.PDFBO;
import com.xxx.PDFDTO;
import com.liferay.portal.kernel.servlet.HttpHeaders;
import com.liferay.portal.kernel.util.ParamUtil;

@Controller("pdfController")
@RequestMapping(value = "view")
public class PDFController {
    private final static Logger LOG = LoggerFactory.getLogger(PDFController.class);

    //This is using Spring 3.0 Annotation Mapping (Spring Portlet MVC Architecture)
    @ResourceMapping
    public void serveResource(ResourceRequest resourceRequest, ResourceResponse res) throws PortletException, IOException {
        LOG.info("In serveResource: ResourceURL");
        String returnType = ParamUtil.getString(resourceRequest, "reportType");
        String pdfNumber = ParamUtil.getString(resourceRequest, "pdfNumber");
        LOG.info("returnType:" + returnType + " pdfNumber:" + pdfNumber);
        String filename = "FILENAME_"+pdfNumber+".pdf";
        // HttpServletRequest request =
        // PortalUtil.getHttpServletRequest(resourceRequest);

        if (returnType != null && returnType.equals("pdf")) {
            try {
                //GET YOUR PDF HERE
                //PDFBO pdfBO = new PDFBO();
                //PDFDTO pdfContentVO = null;
                //pdfContentVO = pdfBO.getPDF(pdfNumber);
                res.setContentType("application/pdf");
                res.addProperty(HttpHeaders.CACHE_CONTROL, "max-age=3600, must-revalidate");
                res.addProperty(HttpHeaders.CONTENT_DISPOSITION,"filename="+ filename);
                //Use this to directly download the file
                //res.addProperty(HttpHeaders.CONTENT_DISPOSITION,"attachment");
                OutputStream out = res.getPortletOutputStream();
                //out.write(pdfContentVO.getPdfData());
                out.write(/*get pdf byte[] Array Here */);
                out.flush();
                out.close();
            } catch (Exception e) {
                LOG.info("Error in " + getClass().getName() + "\n" + e);
            }
        }
    }
}

Edit: If you are using previous versions of Liferay, this is a great article to implement file download/serving through Liferay - https://www.liferay.com/web/raymond.auge/blog/-/blogs/801426

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文