2011-12-28 57 views
2

我正在寻找一种通过Liferay Portal向浏览器发送PDF(直接显示)文件的方式。找到了很多解决方案 - 最受欢迎的解决方案是编写可以完成这项工作的Servlet。我已经阅读了JSR 286规范中的Portlet资源服务,有人可以详细说明Spring 3.0 Portlet MVC吗?在Spring Portlet MVC架构服务PDF - Liferay 6.0.6

<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(); 
      } 
     } 

    } 

回答

7

我找不到对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春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实现文件下载/服务 - https://www.liferay.com/web/raymond.auge/blog/-/blogs/801426

+0

在Spring Controller中映射请求映射URL的实际方法是使用portlet:resourceURL标记中的'id'属性,然后将其映射到控制器的@ResourceMapping属性中。这应该将URL映射到方法。但如果你不介意自己比较和映射,上面的方法工作正常。 – 2012-04-21 11:45:18