使用liferay ServeResource

时间:2016-12-06 18:12:12

标签: java ajax jsp liferay-6 portlet

TL; DR如何使用java portlet ResourceRequest从我的服务器下载文件?

我正在使用GenericPortlet类为Liferay 6.1.0 portlet构建基本上是CMS的浏览器。在view.jsp中,一旦用户打开CMS资源,并且资源(HTML页面)具有指向PDF或图像的链接,这些链接将触发以下代码以请求下载资源(以模仿正常行为) :

view.jsp的

<portlet:resourceURL var="ajaxResourceUrl"/>

$("#file-viewer").on("click", "a", function(e){
/* Prevent normal link navigation behavior*/
e.preventDefault();

/* Get the name of the file we want to download*/
var linkPath = $(this).attr("href");

/* Send the path to the server with resource request*/
$.ajax({
    method: 'POST',
    url: '<%= ajaxResourceUrl %>',
    data: {"action": "displayAttachment", "attachment": linkPath },
    dataType: "text",
    success: function(data) {
        console.log("success:" + data.substring(0, 10));
        if(data !== ""){
            if(linkPath.substring(linkPath.length - 4, linkPath.length) === ".pdf"){
                /* Resource is a PDF */


            } else {
                /* Resource is HTML */

                var html = data;
                var uri = "data:text/html," + encodeURIComponent(html);
                var newWindow = window.open(uri);

            }
        } else {
            $("#file-viewer").html("Error retrieving attachment \n" +     $("#file-viewer").html());

        }
    },
    error: function(err) {
        console.log("error" + err);
    }

});

});

这是由服务器上的此方法处理的:

CMSBrowser.java

public void serveResource(ResourceRequest request, ResourceResponse response) throws PortletException, IOException {

    String action = request.getParameter("action");

    // handler for multiple ajax actions
    if (new String("displayItem").equals(action)) {

        //other irrelevant code 

    } else if (new String("displayAttachment").equals(action)) {

        String filePath = request.getParameter("attachment");
        PortletPreferences portletPreferences = request.getPreferences();
        String rootPath = portletPreferences.getValue("rootPath", "");
        filePath = rootPath + filePath; 

        try {
                File f = new File(filePath);
                System.out.println("Trying to serve: " + filePath);

               String mimeType =    request.getPortletSession().getPortletContext().getMimeType(f.getName());

                response.setContentType(mimeType);
                response.addProperty(
                    HttpHeaders.CACHE_CONTROL, "max-age=3600, must-revalidate");

                OutputStream out = response.getPortletOutputStream();

                InputStream in = new FileInputStream(f);  // some InputStream


                    byte[] buffer = new byte[4096];
                    int len;

                    while ((len = in.read(buffer)) != -1) {
                        out.write(buffer, 0, len);
                    }

                    out.flush();
                    in.close();
                    out.close();

            } catch (IOException e) {
                _log.error("serveResource: Unable to write IO stream, IOException: ", e);
            }

    }  
}

我在Eclipse,浏览器或服务器日志中没有收到任何错误。什么都没有发生,除了ajax成功方法返回&#34;错误检索附件&#34;如果没有从服务器返回任何内容。

我根据第4篇帖子找到了java代码here

具体来说,我正在尝试使用此选项在新选项卡中下载/打开服务器上但不在portlet /门户中或在Web上可访问的PDF和图像。此方法适用于HTML页面。

我的问题是如何使用java portlet ResourceRequest从我的服务器下载文件?

(如果有不匹配的右括号或花括号请忽略这一点,我不得不删掉大量代码在此发布;所有内容都在我的IDE中正确排列和关闭。

1 个答案:

答案 0 :(得分:0)

在尝试使用类似解决方案后,我尝试删除view.jsp中的AJAX函数并将其替换为:

    window.open('<%= ajaxResourceUrl %>&action=displayAttachment&attachment=' + linkPath);

这(以某种方式)工作,它现在允许我在新标签页中打开HTML,PDF和图像。