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中正确排列和关闭。
答案 0 :(得分:0)
在尝试使用类似解决方案后,我尝试删除view.jsp中的AJAX函数并将其替换为:
window.open('<%= ajaxResourceUrl %>&action=displayAttachment&attachment=' + linkPath);
这(以某种方式)工作,它现在允许我在新标签页中打开HTML,PDF和图像。