2015-10-02 106 views
1

我想通過客戶端上下文更新SharePoint中的創建者列,但我的代碼無法正常工作。該列是文檔庫列。通過ClientContext更新Sharepoint文檔庫列的「創建人」列

我嘗試了幾個選項。我的第一個代碼塊無法更新該字段,但我的第二個代碼塊實際上是這樣做的,但它無法管理上傳大於150   MB的文件,這是我的第一個代碼塊能夠完成的。

這是我的第一個代碼塊:

using (var ctx = new ClientContext(spSiteUrl)) 
{ 
    ctx.RequestTimeout = 1000000; 
    Web web = ctx.Web; 

    string strUser = "spDomain\\adminUser1"; 

    var file = ctx.Web.GetFileByServerRelativeUrl(newServerRelPath); 
    var item = file.ListItemAllFields; 

    //First approach and it doesn't work 
    // -> Start 
    FieldUserValue fuvUser = new FieldUserValue(); 
    User oUser = web.EnsureUser(strUser); 
    ctx.Load(oUser, 
    props=>props.Id, 
    props=>props.LoginName); 
    item["Author"] = oUser; 
    item["Created_x0020_By"] = oUser; 
    // -> End 

    //Second approach and still it doesn't work 
    // -> Start 
    List list = web.GetList(spDocLibUrl); 
    list.Fields.GetByInternalNameOrTitle("Author").ReadOnlyField = false; 
    list.Fields.GetByInternalNameOrTitle("Created_x0020_By").ReadOnlyField = false; 
    list.Update(); 
    item["Author"]=web.EnsureUser(strUser); 
    item["Created_x0020_By"] = web.EnsureUser(strUser); 
    // -> End 

    item.Update(); 
    ctx.ExecuteQuery(); 

} 

如何更新的創建領域

我在我的代碼上做的另一種方法實際上可以更新創建者字段,但是我的問題在於我無法上傳大於150   MB的文件。

這裏是我的第二個代碼塊:

SPSecurity.RunWithElevatedPrivileges(delegate() 
{ 
    using (SPSite site = new SPSite(spSiteUrl)) 
    { 
     using (SPWeb web = site.OpenWeb()) 
     { 
      //read file in filestream 
      System.IO.FileStream fStream = System.IO.File.OpenRead(filePath); 
      byte[] contents = new byte[fStream.Length]; 
      fStream.Read(contents, 0, (int)fStream.Length); 
      fStream.Close(); 

      web.AllowUnsafeUpdates = true; 
      SPFolder rootFolder = web.GetFolder(spFolderUrl); 

      string strUser = "spDomain\\adminUser1"; 
      SPUser userCreatedBy = web.EnsureUser(strUser); 

      //This part sets the created by field successfully but fails to add files bigger than 150mb. 
      SPFile file = rootFolder.Files.Add(item.Name, contents,userCreatedBy,userCreatedBy,DateTime.Now,DateTime.Now); 

      int id = file.Item.ID; 
      SPListItem listItem = file.Item;//docsLibrary.GetItemById(id); 
      listItem["Created"] = item.CreationTime; 
      listItem["Modified"] = item.LastWriteTime; 
      listItem.Update(); 

      web.AllowUnsafeUpdates = false; 
     } 
    } 
}); 

也很明顯,我的第二個代碼塊不具有將requestTimeout設置。也許這可能是它無法上傳更大文件的原因。我想設置RequestTimeOut,但是如何將其添加到我的代碼中,或者有沒有其他更好的方法來執行此操作

業務需求:編程方式上傳文件大於150   MB(300   MB,800   MB甚至1   GB以上)到SharePoint文檔庫並設置創建通過場誰是作者該文件來自本地源文件夾。

請讓我知道是否有什麼不清楚的問題,以便我可以更新它。

回答

0

嘗試設置MaxReceivedMessageSize:

SPWebService ws = SPWebService.ContentService; 
SPClientRequestServiceSettings clientSettings = ws.ClientRequestServiceSettings; 
clientSettings.MaxReceivedMessageSize = 10485760; 
ws.Update(); 
Console.WriteLine(clientSettings.MaxReceivedMessageSize); 

或使用HTTP DAV:

ClientContext context = new ClientContext("http://spdevinwin"); 
using (FileStream fs = new FileStream(@"C:\Work\Files\17580_FAST2010_S03_Arch.pptx", FileMode.Open)) 
{ 
Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, "/documents/17580_FAST2010_S03_Arch from client OM.pptx", fs, true); 
} 

要更改使用修改:

RunCodeWithNewClientContext((ctx, item) => { 
    const string template = "i:0#.f|membership|{0}@<tenant>.onmicrosoft.com"; 
    var modifiedBy = ctx.Web.EnsureUser(string.Format(template, vm.ModifiedBy)); 
    var createdBy = ctx.Web.EnsureUser(string.Format(template, vm.CreatedBy)); 

    ctx.Load(modifiedBy); 
    ctx.Load(createdBy); 
    ctx.ExecuteQuery(); 

    item["Editor"] = modifiedBy.Id; 
    var modifiedByField = new ListItemFormUpdateValue { 
     FieldName = "Modified_x0020_By", 
     FieldValue = modifiedBy.Id.ToString() 
    }; 

    item["Author"] = createdBy.Id; 
    var createdByField = new ListItemFormUpdateValue { 
     FieldName = "Created_x0020_By", 
     FieldValue = createdBy.Id.ToString() 
    }; 

    item["Modified"] = vm.ModifiedAt.ToUniversalTime(); 
    item["Created"] = vm.CreatedAt.ToUniversalTime(); 

    // it doesn't matter if you add both modifiedByField and createdByField. 
    // As long as the list is non-empty all changes appear to carry over. 
    var updatedValues = new List<ListItemFormUpdateValue> { modifiedByField, createdByField }; 
    item.ValidateUpdateListItem(updatedValues, true, "Ignored on explicit checkin/checkout"); 
    ctx.ExecuteQuery(); 
}); 
+0

這看起來很有希望。我可能需要回到我的代碼並嘗試這可能會幫助我修復它。讓我看看它是否有效。感謝@BOG實驗室。 –

+0

我認爲後面的代碼來自這個博客。 http://bugfree.dk/blog/2015/02/03/how-to-set-document-library-item-created-by-and-modified-by-fields-using-sharepoint-csom/ –

+0

是的。但我們不應該發佈鏈接,因爲我複製了thw代碼片段。我希望它能解決你的問題。 – STORM

相關問題