Wednesday, June 18, 2014

SharePoint - Spostare Document Set di grandi dimensioni

Per lo spostamento di Document Set da una libreria ad un'altra occorre tenere conto del contesto in cui si implementa la procedura di spostamento, in particolare se esiste la possibilità che i Document Set contengano documenti di dimensioni superiori ai 10 Mb.

Export/Import

In rete è la soluzione più consigliata, ma attenzione: per file di grandi dimensioni (superiori a 10Mb), funziona solo nel caso di Event Receiver (o Console Application).
Utilizzato in un Timer Job si riceve un errore decisamente incomprensibile, in fase di Export: "Unable to determine the identity of domain".
Questo messaggio ci ha fatto penare un bel po' ed è riferito ad una classe utilizzata dal package di gestione dello stream in fase di esportazione del Document Set (class IsolatedStorage).

//get Document Set Source
DocumentSet documentSet = DocumentSet.GetDocumentSet(itemToMove.Folder);
//get Target List
SPList targetList = web.Lists[docSetListTargetName];
//get content type id for target list 
SPContentTypeId contentTypeId = targetList.ContentTypes["Custom Document Set Name"].Id;
//export in a stream
byte[] documentSetData = documentSet.Export();
//get document set name
string documentSetName = documentSet.Item.Name;

//get folder target
SPFolder targetFolder = targetList.RootFolder;

//Assign all properties
System.Collections.Hashtable propertiesParent = itemToMove.Properties;

//Create new Document Set 
DocumentSet docSet = DocumentSet.Import(documentSetData, documentSetName, targetFolder, contentTypeId, propertiesParent, currentWeb.CurrentUser);

//then go to delete source document set


Folder.MoveTo

Utilizzando questo metodo viene spostato il Document Set con il suo contenuto, qualsiasi peso abbia, come fosse una Cartella (SPFolder) e successivamente, viene convertita in Document Set Content Type.

La cosa buona è che funziona anche per i Timer Job quindi senza problemi di size.

//get Document Set Source
DocumentSet documentSet = DocumentSet.GetDocumentSet(itemToMove.Folder);
//get Target List
SPList targetList = web.Lists[docSetListTargetName];
//get content type id for target list 
SPContentTypeId contentTypeId = targetList.ContentTypes["Custom Document Set Name"].Id;
//set Url of new Document Set in target list
string moveUrl = targetList.RootFolder + "/" + itemToArc.Folder.Name;
//move document set as folder
itemToMove.Folder.MoveTo(moveUrl);
//check new Document Set
SPFolder newDocset = currentWeb.GetFolder(moveUrl);
if (newDocset.Exists)
{
    //Update all fields from source
    foreach (SPField f in itemToMove.Fields)
    {
         if (!f.ReadOnlyField)
         {
              newDocset.Item[f.StaticName] = itemToMove[f.StaticName];
         }
    }
    //IMPORTANT: convert Folder to Document Set 
    newDocset.Item["ContentTypeId"] = contentTypeId;
    newDocset.Item["HTML File Type"] = "SharePoint.DocumentSet";                                                
    //then update
    newDocset.Item.Update();
}
else
{
   // Failed moving the docset or setting ... 
}

//no need to delete source Document Set