将文件添加到FileNet对象存储但是当我检索它时,它是空的,0字节文件

时间:2016-11-09 04:43:45

标签: c# stream memorystream filenet-p8

我能够使用他们的API(FileNet.API.dll)v5.2.1成功将文件发送到Filenet,但是当我尝试检索它时,它是一个没有内容的0字节文件。

这主要是使用他们的demo c#程序中的方法来发送和接收这里找到的文件(http://www-01.ibm.com/support/docview.wss?uid=swg24028791

与我的场景不同的是,我将以Stream格式提供源数据,因此我不需要像演示那样将本地文件转换为Stream。

因此运行以下方法:按此顺序或多或少,重复一些。

main create doc方法执行

                IDocument doc = CreateDocument(stream, fnDoc.mimeType, fnDoc.docName, fnRepo.os, "Common", paRequest);
                IFolder folder = FetchFolder(fnRepo.os, "/");
                doc.Save(RefreshMode.REFRESH);
                IReferentialContainmentRelationship rcr = FileContainable(fnRepo.os, doc, folder);
                rcr.Save(RefreshMode.REFRESH);

                checkInDoc(doc);

上面列出的方法如下

    public static IDocument CreateDocument(Stream stream, String mimeType, String docName, IObjectStore os, String className)
    {
        IDocument doc = null;
        if (className.Equals(""))
            doc = Factory.Document.CreateInstance(os, null);
        else
            doc = Factory.Document.CreateInstance(os, className);
        doc.Properties["DocumentTitle"] = docName;
        doc.MimeType = mimeType;

        IContentElementList cel = CreateContentElementList(stream, docName);
        if (cel != null)
            doc.ContentElements = cel;
        return doc;
    }

下一个被调用的是CreateContentElementList

    public static IContentElementList CreateContentElementList(Stream stream, string docName)
    {
        IContentElementList cel = null;
        if (CreateContentTransfer(stream, docName) != null)
        {
            cel = Factory.ContentElement.CreateList();
            IContentTransfer ct = CreateContentTransfer(stream, docName);
            cel.Add(ct);
        }
        return cel;
    }

最后是CreateContentTransfer

    public static IContentTransfer CreateContentTransfer(Stream stream, string docName)
    {
        IContentTransfer ct = null;
        ct = Factory.ContentTransfer.CreateInstance();
        ct.SetCaptureSource(stream);
        ct.RetrievalName = docName; 
        return ct;
    }

此时ct的长度和大小不存在,但这些可以手动设置,所以我不确定这是否重要。此外,变量流仍然具有内容。

从CreateDocument

返回文档

然后提取文件夹

    public static IFolder FetchFolder(IObjectStore os, String fPath)
    {
        IFolder f = Factory.Folder.FetchInstance(os, fPath, null);
        return f
    }

然后

    public static IReferentialContainmentRelationship FileContainable(IObjectStore os, IContainable c, IFolder folder)
    {
        IReferentialContainmentRelationship rcr = null;
        if (c is IDocument)
            rcr = folder.File((IDocument)c, AutoUniqueName.AUTO_UNIQUE, ((IDocument)c).Name, DefineSecurityParentage.DO_NOT_DEFINE_SECURITY_PARENTAGE);
        else
            rcr = folder.File((ICustomObject)c, AutoUniqueName.AUTO_UNIQUE, ((ICustomObject)c).Name, DefineSecurityParentage.DO_NOT_DEFINE_SECURITY_PARENTAGE);
        return rcr;
    }

    public static void checkInDoc(IDocument doc)
    {
        doc.Checkin(AutoClassify.AUTO_CLASSIFY, CheckinType.MINOR_VERSION);
        doc.Save(RefreshMode.REFRESH);
        doc.Refresh();
    }

所以我错过了一些东西,最后一部分是将内容放在服务器上还是什么?

1 个答案:

答案 0 :(得分:0)

当调用ct.SetCaptureSource(stream);时,Stream应该是未读的(或者可能是Stream重置的位置),以便API可以捕获所需的文件。

如果Stream的位置在Stream的末尾,则不会最终向IContentTransfer对象发送任何内容,从而导致ContentElement包含0个字节。