liferay中的文件下载

2013年09月26日 Liferay 评论 6 条 阅读 5,255 views 次

觉得Liferay中的文件下载其实很简单,所以一直没有特别写相关的内容,其实主要的的内容在前面介绍ajax的时候已经介绍完了,参考《Liferay 6.1开发学习(十):在Liferay中使用Ajax》,但今天在群上碰到有人问文件下载在Liferay中怎么实现,以本篇文章为例简单说明一下。

现在的场景如下,在页面上有一个链接接或按钮,点击之后希望能够下载指定的文件。

portlet的JSP页面的书写

<portlet:resourceURL var="download"/>
<input type="button" value="下载" onclick="download();">
<script type="text/javascript">
function download(){
 window.location = '${download}';
}
</script>

上面是JSP页面,内容很简单上面只有一个按钮,点击此按钮后进入下载。注意在这里使用的是<portlet:resourceURL>标签,而不是portlet:actionURL。

后台业务逻辑处理代码

public void serveResource(ResourceRequest resourceRequest,
 ResourceResponse resourceResponse) throws IOException,
 PortletException {
 HttpServletRequest request = PortalUtil.getHttpServletRequest(resourceRequest);
 HttpServletResponse response = PortalUtil.getHttpServletResponse(resourceResponse);

 File file = new File("d:\\cas-server-3.5.2.rar");
 byte[] bytes = FileUtil.getBytes(file);

 ServletResponseUtil.sendFile(request, response, "CAS_Server_3.5.2.rar", bytes, ContentTypes.APPLICATION_OCTET_STREAM);

 super.serveResource(resourceRequest, resourceResponse);
 }

在这里为了演示,我下载的文件来源是我本地的一个文件。核心代码其实只有一句,就是ServletResponseUtil.sendFile方法,此方法算是Liferay封装的一个工具类,我们也可以像前文ajax那篇文章介绍的一样获取到PrintWriter ,然后使用它写出也一样。下面来介绍一下sendFile的方法里面的参数,前两个参数为httpservletRequest与response,这两个参数可以参考上面的代码获取,这里不详细说明。

第三个参数:fileName,这个的名称为希望下载的时候显示的是什么名称,此名称最终会在http的头信息的,出现这样的内容Content-Disposition:attachment; filename="CAS_Server_3.5.2.rar"。这样当浏览器保存我们这个文件时就知道文件的名称是什么。

第四个参数:byte数组的文件体。这个没什么说明的。

第五个参数:contentType,这个参数是用来标明文件类型的,liferay的工具类ContentTypes里面对常用的contentType都有说明。如果我们希望文件能够直接下载则就选用APPLICATION_OCTET_STREAM这样的类型,标明是二进制类型,这样浏览器会自动启用下载。如果是期望不同的类型不同的处理,这里可以根据文件的类型,不同的类型写入不同的contentType。如果将contentType标名是图片,则会在浏览器里直接显示图片,如果是PDF,则会在浏览器调用PDF查看器直接在浏览器中打开。

前面这所以说文件下载和AJAX的处理是一样的,现在看整个逻辑确实是一样,区别其实只在contentType上,其实ajax处理也是一种特殊的文件下载,ajax的contentType,一般是text/plain。

其实文件下载的原理就是获取到文件,然后将文件在response里面输出。上面的代码,在实际中我们可能会需要传入一个参数,比如文件id,然后根据文件id获取到文件的内容,再写出。参数的传递和普通的portlt处理一样,同样也可以参考前文的ajax处理那篇博客。

用户头像

6 条留言  访客:4 条  博主:2 条

  1. avatar 西安-学习

    这个例子 我试过了,只能支持1个文件的下载,请问 冷大,如果是多个文件 该如何写?

  2. avatar 问问

    胡老师 请问从文档库下载文件怎么实现

  3. avatar 毛桃

    请问我想把已经上传到媒体库中的文件下载如何实现

给我留言

Copyright © IT人生录 保留所有权利.   主题设计 知更鸟 滇ICP备16001547号-1

用户登录

分享到: