liferay中的文件下载
觉得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处理那篇博客。
这个例子 我试过了,只能支持1个文件的下载,请问 冷大,如果是多个文件 该如何写?
看AJAX那一章,resrouceID
冷大 那怎么显示下载的那个连接呢…
胡老师 请问从文档库下载文件怎么实现
请问我想把已经上传到媒体库中的文件下载如何实现
http://www.huqiwen.com/2012/10/24/liferay-6-1-development-study-12-file-upload/
这个里面的第二部分,获取文章路径