2016-11-09 5 views
0

Я могу успешно отправить файл в Filenet, используя их API (FileNet.API.dll) v5.2.1, но когда я пытаюсь retreive it, это 0-байтовый файл без содержимого.Добавление файла в хранилище объектов FileNet, но когда я его извлекаю, он пуст, 0 байтовый файл

Это, по существу, с использованием методов, найденные в их дем C# программы, которая отправляет и получает файлы, найденные здесь (http://www-01.ibm.com/support/docview.wss?uid=swg24028791)

Разницы с моим сценарием является то, что я буду иметь исходные данные уже в виде потока, так что я дон 't нужно преобразовать локальный файл в поток, как это делает demo.

Таким образом, следующие методы запускаются более или менее в этом порядке, некоторые повторяются.

Основной метод создания док выполняет

   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

Был ли ваш поток ранее прочитан (как в, вы в конце вашего потока)? Указывает ли ACCE, что присутствует ContentElement? –

+0

Хороший вопрос, я передаю его как MemoryStream, который был создан методом Stream.CopyTo, тогда GetButter выполняется с MemoryStream, поэтому я предполагаю, что это может быть в конце. Позвольте мне проверить это и что такое ACCE? – programmerNOOB

+0

То есть, положение потока было в конце, установите его до нуля: IContentTransfer.SetCaptureSource (поток); был вызван – programmerNOOB

ответ

0

При вызове ct.SetCaptureSource(stream); поток должен быть непрочитанным (или, возможно, местом сброса потока), чтобы API мог захватить нужный файл.

Если позиция Потока находится в конце Потока, вы не сможете отправить что-либо объекту IContentTransfer, в результате чего ContentElement содержит 0 байт.