Liferay 6.1开发学习(十二):文件上传处理

一、在portlet中取到上传的文件

这两的获取有两种方法,一种是普通的fileupload的处理方法,一种是使用liferay的API

1、使用fileupload的处理方法:

此种方法的获取和在普通的servlet里面使用fileupload的方法一样,核心代码如下 :

DiskFileItemFactory factory = new DiskFileItemFactory();
 //PortletFileUpload upload = new PortletFileUpload(factory); 
 ServletFileUpload upload = new ServletFileUpload(factory);
 upload.setSizeMax(1024 * 1024 * 200);
 HttpServletRequest servletRequest = PortalUtil.getHttpServletRequest(request);
 List<FileItem> items = upload.parseRequest(servletRequest);

注:也可以使用此行代码,如果使用了此行则下面的HttpServletRequest servletRequest = PortalUtil.getHttpServletRequest(request)就可以不要,在upload.parseRequest里面传actionRequest。但是此方法在weblogic环境下面会出错,所以如果要在weblogic下面运行,请使用下面的servletFileUpload。

其他代码就和在普通的Servlet里面使用fileupload一样,这里不再多写。

2、使用Liferay的API获取上传文件

推荐使用下面的代码进行文件上传。

UploadPortletRequest uploadPortletRequest = PortalUtil.getUploadPortletRequest(actionRequest);
 String sourceFileName = uploadPortletRequest.getFileName("file");
 String contentType = uploadPortletRequest.getContentType("file");
 long size = uploadPortletRequest.getSize("file");
// File file = uploadPortletRequest.getFile("file");
 InputStream is = uploadPortletRequest.getFileAsStream("file");

:其中的getFileName中的file为<input type="file" name="file">中的name值,具体的可以要看自己的调整。

二、将获取到的文件上传到Liferay的文档库

1、上传文件

在portlet中获取到我们上传的文件,只算是完成了第一步。取到了上传的文件,怎么传到Liferay的文件库中呢?使用如下的接口

DLAppLocalServiceUtil.addFileEntry(long userId, long repositoryId, long folderId,java.lang.String sourceFileName, java.lang.String mimeType,java.lang.String title, java.lang.String description,java.lang.String changeLog, byte[] bytes,com.liferay.portal.service.ServiceContext serviceContext)

此接口的参数逐个说明:

long userId上传此文件的用户id

long repositoryId仓库存储ID,此ID一般为groupid

long folderId:文件夹ID,可以自己创建,或使用liferay默认的如:DLFileEntryTypeConstants.FILE_ENTRY_TYPE_ID_BASIC_DOCUMENT等,最好是自己根据上传资源的情况分类,如新闻的存到新闻文件,博客的存成博客文件等

String sourceFileName上传文件的源文件名

String mimeType算是文件类型,可以使用mimeType = MimeTypesUtil.getContentType(fileName);根据文件名获取。

String title文件标题,这个与SourceFileName的区别在于,此title是最终显示在系统上的,可以由用户输入,源文件名称是上传获取的文件名称,不能手动改变。可以留空。

String description关于此文件的描述,可以留空。

String changeLog文件修改日志,可以留空。

byte[] bytes文件的正文件,字节数组。

ServiceContext serviceContext此类可以通过以下代码

ServiceContext serviceContext = ServiceContextFactory.getInstance(DLFileEntry.class.getName(), request);

获取。此对象里面包含了一些环境信息,如groupid,companyid,权限,门户路径,当前语言,userId等信息。

在实际应用中可以自己将上面的这个接口再做一层封装,作为一个公共的文件上传接口,以供其他需要文件上传的地方调用,具体的请自行封装,这里就不再帖我封装的代码。

2、获取文件路径

上面的文件上传之后返回的是一个FileEntry的对象,如果获取到上传的文件的路径呢,方法如下,可以定义一个方法,用来返回文件路径,此方法对图片、各式文件都是有效。

public static String getFilePath(FileEntry fileEntry) {
 if (null!=fileEntry) {
 return "/documents/" + fileEntry.getRepositoryId() + "/" + fileEntry.getFolderId() + "/"
 + HttpUtil.encodeURL(HtmlUtil.unescape(fileEntry.getTitle()), true) + "/" + fileEntry.getUuid();
 }else {
 //如有需要,此处可以定义一个默认图片
 return StringPool.BLANK;
 }

或者下面的这个方法,下面的这个更简便一些

public static String getFilePath(FileEntry fileEntry) {
 if (null!=fileEntry) {
 return "/documents/" + fileEntry.getRepositoryId() + "/" + fileEntry.getUuid();
 }else {
 //如有需要,此处可以定义一个默认图片
 return StringPool.BLANK;
 }

有时候如果文件是一个图片,上传的图片可以很大,如何获取一个缩略图呢?如下:

public static String getSmallImagePath(FileEntry fileEntry){
String path = getFilePath(fileEntry);
return path+"?imageThumbnail=1";
}

FastJSON使用技巧两则

FastJSON是阿里的温少写的,详细介绍请看:http://code.alibabatech.com/wiki/pages/viewpage.action?pageId=2424946。具有高性能、支持标准、依赖少的方便之处。

1、字段名称映射

比如现在JavaBean中有一个字段名称为parentId,想将此字段转换为pId,则可以使用如下代码。

NameFilter filter = new NameFilter() { 
 public String process(Object source, String name, Object value) {
 if (name.equals("parentId")) {
 return "pId";
 }
 
 return name;
 }
 
 };
 
 String jsonString = StringUtils.EMPTY;
 SerializeWriter out = new SerializeWriter();
 try {
 JSONSerializer serializer = new JSONSerializer(out);
 serializer.getNameFilters().add(filter);
 serializer.write(columns);//这里的columns为待转换的对象
 jsonString = out.toString();
 } finally {
 out.close();
 }

2、去除JSON中的key值的引号

FastJSON中默认为转换后的JSON中的key值是带引号的,有些特殊情况或者组件需要不带引号的,可以使用下面的代码将引号去掉。
在上面的代码中添加下面的这行代码,则可以将转换后的字段名称的引号去掉。
serializer.config(SerializerFeature.QuoteFieldNames, false);

Liferay6.1简单增删改查示例

(建立了一个讨论Liferay的群:6537876,探讨学习Liferay的二次开发、Portal技术、企业信息门户(EIP)等相关内容,欢迎加入。)

写了一个最简单的portlet的增删改查的示例。下载地址:点击这里


portlet的创建,可以参考:

Liferay 6.1开发学习(二):创建一个Portlet工程

Liferay 6.1开发学习(三):Portlet简述

ServiceBuilder的使用,可以参考:Liferay 6.1开发学习(四):Service Builder

说明:

此demo演示的是最简单的一个增删改查,没有写css,页面中数据提交前没有做javascript的非空验证,数据的删除没有对用户进行提醒,在实际的开发环境中请注意以上细节。

可能碰到的问题

问题1:不会跳转页面

如果是看完demo,自己开发中可能遇到,点击了添加不会跳转到相关页面。请检查portlet.xml中是否有下面的配置:

<init-param>
 <name>copy-request-parameters</name>
 <value>true</value>
 </init-param>

问题2:显示SDK不正确,SDK不能配置等

请将下载的源码工程,解压后复制到SDK的portlets目录下面,然后再使用Eclipse导入,在导入的时候不要勾选复制工程到workspace的选项。

从常见文档中提取纯文本内容

要想使用Lucene检索office文档(word、excel、ppt等)、PDF、HTML文档,通常的处理策略是先从这些文档中提取出纯文本,然后再进行相关索引处理等。

一、从office中提取纯文本

从office文件中提取纯文本,可以使用POI(http://poi.apache.org/),最新版本为3.8。从office文件中提取纯文本方法很简单。只需要两行代码即可。

POITextExtractor extractor = ExtractorFactory.createExtractor(is);
 String contents = extractor.getText();

第一行中传入的is参数为office文件的inputstream。这里不分word、excle还是ppt,不区分03版还是07版,只需要将文件的inputStream传入此方法中。再使用extractor.getText()。得到的即为office文件的纯文本数据。

注意:有时候可能由于文件的源访问,导致提取的纯文本里面有一些特殊字符,可以使用下面的方法过滤掉。

/**
 * 过滤特殊字符
 * 
 * @param contents
 * @return
 */
 public static String filterSpecialChar(String contents) {
 contents = contents.replace('\u0003', '\u0000');
 contents = contents.replace('\u0004', '\u0000');
 contents = contents.replace('\u000b', '\u0000');
 contents = contents.replace('\u000c', '\u0000');
 contents = contents.replace('\u0007', '\u0000');
 contents = contents.replace('\u0008', '\u0000');
 contents = contents.replace('\u0013', '\u0000');
 contents = contents.replace('\u0014', '\u0000');
 contents = contents.replace('\u0015', '\u0000');
 contents = contents.replace('\u0016', '\u0000');
 contents = contents.replace('\u0020', '\u0000');
 return contents;
 }

二、从PDF中提取纯文本

从PDF中提取纯文本,可以使用PDFBox组件(http://pdfbox.apache.org/),最新版本为1.7.1。需要的jar包为:pdfbox、fontbox、jempbox等,最好再加上pdfbox-lucene。

如果使用了pdfbox-lucene的包,则不用自己写pdfbox的处理方法,直接调用相关方法(LucenePDFDocument类里面)就行了,这里介绍,如何手写实现,也很简单。

PDDocument pdfDocument = PDDocument.load(is);
if (pdfDocument.isEncrypted()) {
 // 仅仅尝试使用默认密码打开加密的PDF
 pdfDocument.decrypt("");
 }
// 创建一个writer用来作来存储文件正文
 StringWriter writer = new StringWriter();
 if (stripper == null) {
 stripper = new PDFTextStripper();
 } else {
 stripper.resetEngine();
 }
 stripper.writeText(pdfDocument, writer);
String contents = writer.getBuffer().toString();

上面is同样为PDF文件的inputStream。下面的contents为提取到的PDF的纯文本内容。

三、从HTML文件中提取正文

从HTML文件中提取正文,简单说就是去除HTML文件中的HTML标签,这处常用的方法有许多,如使用正则表达式、html parse等。这里我们使用JSOUP,这个更方便快捷。可以参考我以前写的一篇文章:使用JSOUP处理HTML文档

在获取到Document之后,使用String text = document.text(); 即可获取到纯文本数据。

转载于:https://my.oschina.net/ckaifeng/blog/473191

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将Apache的commons-fileupload.jar放在应用程序的WEB-INF\lib下,即可使用。下面举例介绍如何使用它的文件上传功能。 所使用的fileUpload版本为1.2,环境为Eclipse3.3+MyEclipse6.0。FileUpload 是基于 Commons IO的,所以在进入项目前先确定Commons IO的jar包(本文使用commons-io-1.3.2.jar)在WEB-INF\lib下。 此文作示例工程可在文章最后的附件中下载。 示例1 最简单的例子,通过ServletFileUpload静态类来解析Request,工厂类FileItemFactory会对mulipart类的表单中的所有字段进行处理,不只是file字段。getName()得到文件名,getString()得到表单数据内容,isFormField()可判断是否为普通的表单项。 demo1.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> //必须是multipart的表单数据。 <form name="myform" action="demo1.jsp" method="post" enctype="multipart/form-data"> Your name: <br> <input type="text" name="name" size="15"><br> File:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html> demo1.jsp <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="java.util.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <% boolean isMultipart = ServletFileUpload.isMultipartContent(request);//检查输入请求是否为multipart表单数据。 if (isMultipart == true) { FileItemFactory factory = new DiskFileItemFactory();//为该请求创建一个DiskFileItemFactory对象,通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。 ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request); Iterator<FileItem> itr = items.iterator(); while (itr.hasNext()) { FileItem item = (FileItem) itr.next(); //检查当前项目是普通表单项目还是上传文件。 if (item.isFormField()) {//如果是普通表单项目,显示表单内容。 String fieldName = item.getFieldName(); if (fieldName.equals("name")) //对应demo1.html中type="text" name="name" out.print("the field name is" + item.getString());//显示表单内容。 out.print("<br>"); } else {//如果是上传文件,显示文件名。 out.print("the upload file name is" + item.getName()); out.print("<br>"); } } } else { out.print("the enctype must be multipart/form-data"); } %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> </body> </html> 结果: the field name isjeff the upload file name isD:\C语言考试样题\作业题.rar 示例2 上传两个文件到指定的目录。 demo2.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> <form name="myform" action="demo2.jsp" method="post" enctype="multipart/form-data"> File1:<br> <input type="file" name="myfile"><br> File2:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html> demo2.jsp <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="java.util.*"%> <%@ page import="java.io.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%String uploadPath="D:\\\\temp"; boolean isMultipart = ServletFileUpload.isMultipartContent(request); if(isMultipart==true){ try{ FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request);//得到所有的文件 Iterator<FileItem> itr = items.iterator(); while(itr.hasNext()){//依次处理每个文件 FileItem item=(FileItem)itr.next(); String fileName=item.getName();//获得文件名,包括路径 if(fileName!=null){ File fullFile=new File(item.getName()); File savedFile=new File(uploadPath,fullFile.getName()); item.write(savedFile); } } out.print("upload succeed"); } catch(Exception e){ e.printStackTrace(); } } else{ out.println("the enctype must be multipart/form-data"); } %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> </body> </html> 结果: upload succeed 此时,在"D:\temp"下可以看到你上传的两个文件。 示例3 上传一个文件到指定的目录,并限定文件大小。 demo3.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> <form name="myform" action="demo3.jsp" method="post" enctype="multipart/form-data"> File:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html> demo3.jsp <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="java.util.*"%> <%@ page import="java.io.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <% File uploadPath = new File("D:\\temp");//上传文件目录 if (!uploadPath.exists()) { uploadPath.mkdirs(); } // 临时文件目录 File tempPathFile = new File("d:\\temp\\buffer\\"); if (!tempPathFile.exists()) { tempPathFile.mkdirs(); } try { // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb factory.setRepository(tempPathFile);//设置缓冲区目录 // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB List<FileItem> items = upload.parseRequest(request);//得到所有的文件 Iterator<FileItem> i = items.iterator(); while (i.hasNext()) { FileItem fi = (FileItem) i.next(); String fileName = fi.getName(); if (fileName != null) { File fullFile = new File(fi.getName()); File savedFile = new File(uploadPath, fullFile .getName()); fi.write(savedFile); } } out.print("upload succeed"); } catch (Exception e) { e.printStackTrace(); } %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> </body> </html> 示例4 利用Servlet来实现文件上传。 Upload.java package com.zj.sample; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; @SuppressWarnings("serial") public class Upload extends HttpServlet { private String uploadPath = "D:\\temp"; // 上传文件的目录 private String tempPath = "d:\\temp\\buffer\\"; // 临时文件目录 File tempPathFile; @SuppressWarnings("unchecked") public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb factory.setRepository(tempPathFile);// 设置缓冲区目录 // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB List<FileItem> items = upload.parseRequest(request);// 得到所有的文件 Iterator<FileItem> i = items.iterator(); while (i.hasNext()) { FileItem fi = (FileItem) i.next(); String fileName = fi.getName(); if (fileName != null) { File fullFile = new File(fi.getName()); File savedFile = new File(uploadPath, fullFile.getName()); fi.write(savedFile); } } System.out.print("upload succeed"); } catch (Exception e) { // 可以跳转出错页面 e.printStackTrace(); } } public void init() throws ServletException { File uploadFile = new File(uploadPath); if (!uploadFile.exists()) { uploadFile.mkdirs(); } File tempPathFile = new File(tempPath); if (!tempPathFile.exists()) { tempPathFile.mkdirs(); } } } demo4.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> // action="fileupload"对应web.xml中<servlet-mapping>中<url-pattern>的设置. <form name="myform" action="fileupload" method="post" enctype="multipart/form-data"> File:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html> web.xml <servlet> <servlet-name>Upload</servlet-name> <servlet-class>com.zj.sample.Upload</servlet-class> </servlet> <servlet-mapping> <servlet-name>Upload</servlet-name> <url-pattern>/fileupload</url-pattern> </servlet-mapping>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值