2010-09-15 70 views
2

我創建了一些代碼以編程方式創建列表項。現在我想將一個文件附加到列表中。我收到了401錯誤:未經授權。我已經設置了用於創建項目但不附加文件的憑據。有任何想法嗎?SP 2010附加文件客戶端對象模型

Dim credentials As New System.Net.NetworkCredential(MyUser, MyPassword, MyDomain) 

Dim SiteUrl As String = MyUrl 
Dim clientContext As New ClientContext(SiteUrl) 

clientContext.Credentials = credentials 

Dim list As List = clientContext.Web.Lists.GetByTitle(MyList) 
Dim itemCreateInfo As New ListItemCreationInformation() 
Dim listItem As Microsoft.SharePoint.Client.ListItem = list.AddItem(itemCreateInfo) 

listItem("Title") = "Test Programmatically Create Item" 
listItem("Subject") = "TEST" 
listItem("Class") = "101" 
listItem("Section") = "20" 
listItem.Update() 

listItem.Update() 
clientContext.ExecuteQuery() 

Dim fStream As Stream = File1.PostedFile.InputStream     
Dim attachmentPath As String = String.Format("/{0}/Lists/{1}/Attachments/{2}/{3}", MySite, MyList, listItem.Id, MyFileName)     

'-- This Line Fails with the following error 
'-- The remote server returned an error: (401) Unauthorized.    
Microsoft.SharePoint.Client.File.SaveBinaryDirect(clientContext, attachmentPath, fStream, True) 

我知道設定的憑據是正確的,因爲如果我不設置這些話,我得到這個錯誤試圖創建列表項。

任何想法都不勝感激,或者如果有更好的方法將文件附加到列表項目,請讓我知道。

謝謝!

+0

調整網址後,我能夠得到更遠的距離,但是現在當我嘗試上傳時出現(409):confict錯誤。如果我首先將一個項目附加到列表中,然後運行代碼,則所有其他項目都將被附加。可以通過編程方式添加附件之前首先需要通過SharePoint添加項目的任何想法? – Greg 2010-09-15 16:44:30

+0

我將您的未註冊帳戶合併到您的註冊帳戶中。您現在可以完全控制這個問題,包括能夠在答案下留下意見等。我根據您收到的答案將您的答案轉換爲評論。 – 2011-09-06 19:05:25

回答

0

看看下面的鏈接。這應該指向你正確的方向。

http://www.sharepointdevwiki.com/display/public/Creating+a+List+Item+instance+programmatically+using+the+object+model?focusedCommentId=7897226

你也可以看看SPSecurity.RunWithElevatedPrivileges()。

祝你好運

+0

謝謝,但您提供的鏈接中的示例使用了服務器端對象模型,它不會幫助我,因爲此應用程序在不同的服務器上運行,然後在我們的SharePoint實例上運行。我最終做的是創建一個到lists.asmx的Web引用,然後我可以通過Web服務調用AddAttachment並且可以遠程工作。如果SP 2010客戶端OM具有內置的這種功能,那就太好了,但現在就足夠了。 – Greg 2010-10-28 18:22:59

1

它爲我工作。 我首先讀取需要上傳到內存中的文件,然後使用MemoryStream將文件傳遞給SaveBinaryDirect。

static void moveFileFromOneFarmToAnother() 
    { 

     string srcSiteUrl = "SourceSiteUrl"; 
     string srcFileRelUrl = "ReletiveUrlOfTheListItemAttachment"; 
     ClientContext srcCC = new ClientContext(srcSiteUrl); 
     Web srcWb = srcCC.Web; 
     srcCC.Load(srcWb, w => w.ServerRelativeUrl); 
     srcCC.ExecuteQuery(); 
     FileInformation fI = Microsoft.SharePoint.Client.File.OpenBinaryDirect(srcCC, srcWb.ServerRelativeUrl + srcFileRelUrl); 
     byte[] buffer = new byte[16 * 1024]; 
     byte[] byteArr; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      int read; 
      while ((read = fI.Stream.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       ms.Write(buffer, 0, read); 
      } 
      byteArr = ms.ToArray(); 
     } 
     MemoryStream mnm = new MemoryStream(byteArr); 
     srcCC.ExecuteQuery(); 
     string desSiteUrl = "DestinationSiteUrl"; 
     string desFileUrl = "ReletiveUrlOfTheListItemAttachment"; 
     ClientContext cc = new ClientContext(desSiteUrl); 
     Web wb = cc.Web; 
     cc.Load(wb, w1 => w1.ServerRelativeUrl); 
     cc.ExecuteQuery(); 
     Microsoft.SharePoint.Client.File.SaveBinaryDirect(cc, wb.ServerRelativeUrl + desFileUrl, mnm, true); 
     cc.ExecuteQuery(); 
    } 
相關問題