透过Java与FileNet对附件的上传下载操作,了解复杂事物核心仍旧是那一堆土和沙

        复杂的事物之所以不易理解,很大程度上是有一层我们陌生的内容包裹着,但拨开层层迷雾我们恍然明白原来还是那堆土和沙,不过是添了点水加了把火才形成了面前那堵让我们傻了眼的墙。技术也是这样,往往在一个场合认识的东西,换到另一个场合就辨不出其面貌,甚至望而却步。其原因很简单:形成它时人家经历了水火的锤炼,而自己想了解把控他却不愿经历那水生火热的考验,又拿有那么容易取得真经呢。技术角度上的javaFileNet就是这样一种关系,下面那附件上传下载简要举例。

 

       稍微懂得一些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)存储此documentcontent中;上载并保存此文档。当然一般做到这一步后我们还会将该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);
	}


    涉及到附件的删除则更为简单,javaFiledelete方法,FileNetdocumentdelete方法。总之FileNet在相应的文档内容的操作上会增加一些额外的内容,那些也只是为了适应FileNet的应用领域,而java作为一种基础性开放语言是这些复杂内容的基础,也是这些内容的操作核心。当然上面涉及FileNet代码中某些类需要继续编码才能获得,这些是另一方面的内容了,例如objectStore的获取过程。一点点了解,慢慢体会水与火的凝练

你可能感兴趣的:(java,File,null,delete,存储,buffer)