复杂的事物之所以不易理解,很大程度上是有一层我们陌生的内容包裹着,但拨开层层迷雾我们恍然明白原来还是那堆土和沙,不过是添了点水加了把火才形成了面前那堵让我们傻了眼的墙。技术也是这样,往往在一个场合认识的东西,换到另一个场合就辨不出其面貌,甚至望而却步。其原因很简单:形成它时人家经历了水火的锤炼,而自己想了解把控他却不愿经历那水生火热的考验,又拿有那么容易取得真经呢。技术角度上的java和FileNet就是这样一种关系,下面那附件上传下载简要举例。
稍微懂得一些java IO操作我们便明白我们可以直接将拿到的文件输入流(FileInputStream)输出到文件输出流指定的磁盘位置上。而文件在客户机上是以文件形式存在的,到了服务器方其形式仍旧是以文件形式存在,之间的过程我们可以不必过于关系。对于java端我们只需要清楚拿到File后如何处理即可。简要代码如下所示:
//保存文件 FileInputStream in; FileOutputStream out; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-hh-ss-mm"); String newFileName = userSession.getUser().getUserId() +sdf.format(new Date()) + "_" + fileName; try { in = new FileInputStream(file); //file为上传的文件,为File类型 out = new FileOutputStream(new File(Imgpath.toString(),newFileName)); int c; byte buffer[]=new byte[1024]; while((c=in.read(buffer))!=-1) { for(int i=0;i<c;i++){ out.write(buffer[i]); } } out.close(); in.close(); } catch (FileNotFoundException e) { //TODO e.printStackTrace(); } catch (IOException e) { //TODO e.printStackTrace(); }
下载过程是上面的反过程,我们只需将将本地文件读入程序,作为输入流(InputStream)返回即可。当然我们也许会利用许多不同的方式将此inputStream(文件)传出到客户端下载。此处我们暂不关心,只需了解下载文件需要获取InputStream即可。简要代码如下所示:
File file = new File(filePath);// filePath本地文件路径 if(file.exists()){ try { InputStream is = new FileInputStream(file); return is; } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } }
有了这个基本概念,我们再来看看FileNet上传附件是如何操作。一般来讲结合FileNet的附件操作都是将其作为Document类或其子类的content存在,也就是我们的附件是某个类实例组成部分之一。上传的文件不过是在哪存储着,唯一能够让我们确定的是要将传入java端的File进行持久化(存储在某种介质上)。在FileNet上的相应操作可能较java端的动作要复杂些,但核心不会改变。示范代码如下所示:
public void docContentTest(File file,ObjectStore objectStore,Folder folder){ //create document object Documentdocument=Factory.Document.createInstance(objectStore, "shore_excursion_ticket"); //set content and check in the document ContentElementList cel=Factory.ContentElement.createList(); ContentTransfer ct=Factory.ContentTransfer.createInstance(); FileInputStream fis=null; try { fis=new FileInputStream(file); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } ct.setCaptureSource(fis); cel.add(ct); //set the content to the document document.set_ContentElements(cel); //check in the document document.checkin(AutoClassify.DO_NOT_AUTO_CLASSIFY, CheckinType.MAJOR_VERSION); //set the MIME type document.set_MimeType("image/jpeg"); document.save(RefreshMode.REFRESH); }
分解上述代码可以发现其大致分为三部分:创建要保存此附件的document;将文件输入流(FileInputStream)存储此document的content中;上载并保存此文档。当然一般做到这一步后我们还会将该document实例转移到FileNet特定文件夹下,实例代码如下所示:
public static void file(Document doc, Folder folder) { ReferentialContainmentRelationship rcr = folder.file(doc,AutoUniqueName.AUTO_UNIQUE,null, DefineSecurityParentage.DO_NOT_DEFINE_SECURITY_PARENTAGE); rcr.set_ContainmentName(doc.getProperties().getStringValue("DocumentTitle")); rcr.save(RefreshMode.NO_REFRESH); }
在java中得到本地文件的InputStream较为方便,同样在FileNet中得到document 内容的InputStream也较为方便,只需通过docId拿到document即可。代码如下所示:
Document doc = null; ObjectStore os = userSession.getObjectStore(); doc= Factory.Document.fetchInstance(os, new Id(docId), null); if (!doc.get_ContentElements().isEmpty()) { return doc.accessContentStream(0); }