Загрузите документ в список SharePoint из клиентской модели объекта
Мне нужно загрузить документ в список SharePoint или папку, используя объектную модель клиента на стороне .NET(С#). Каков наилучший способ сделать это?
Требования следующие:
-
Установить значения метаданных
-
Нет ограничений на размер файла
-
Должно работать с библиотеками, которые превышают порог представления списка.
Ответы
Ответ 1
Для загрузки документа в библиотеку документов Sharepoint используйте следующую функцию в клиентской объектной модели:
public void UploadDocument(string siteURL, string documentListName, string documentListURL, string documentName, byte[] documentStream)
{
using (ClientContext clientContext = new ClientContext(siteURL))
{
//Get Document List
List documentsList = clientContext.Web.Lists.GetByTitle(documentListName);
var fileCreationInformation = new FileCreationInformation();
//Assign to content byte[] i.e. documentStream
fileCreationInformation.Content = documentStream;
//Allow owerwrite of document
fileCreationInformation.Overwrite = true;
//Upload URL
fileCreationInformation.Url = siteURL + documentListURL + documentName;
Microsoft.SharePoint.Client.File uploadFile = documentsList.RootFolder.Files.Add(
fileCreationInformation);
//Update the metadata for a field having name "DocType"
uploadFile.ListItemAllFields["DocType"] = "Favourites";
uploadFile.ListItemAllFields.Update();
clientContext.ExecuteQuery();
}
}
Следующая ссылка также полезна для вас
1) http://blogs.msdn.com/b/sridhara/archive/2010/03/12/uploading-files-using-client-object-model-in-sharepoint-2010.aspx
2)http://msdn.microsoft.com/en-us/library/ee956524.aspx
3)http://www.codeproject.com/Articles/103503/How-to-upload-download-a-document-in-SharePoint-20
Ответ 2
Другой способ - использовать метод SaveBinaryDirect. В методе SaveBinaryDirect
для загрузки и скачивания файлов используется распределенное создание и ведение веб-публикации (WebDAV). Без создания собственного пользовательского сервиса WCF WebDAV является наиболее эффективным способом загрузки и загрузки файлов.
using (FileStream fs = new FileStream(FileToImport, FileMode.OpenOrCreate))
{
Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, uri.LocalPath, fs, true);
}
Microsoft.SharePoint.Client.File newFile = web.GetFileByServerRelativeUrl(uri.LocalPath);
context.Load(newFile);
context.ExecuteQuery();
//check out to make sure not to create multiple versions
newFile.CheckOut();
ListItem item = newFile.ListItemAllFields;
item["Created"] = info.SourceFile.CreationTime;
item["Modified"] = info.SourceFile.LastWriteTime;
item.Update();
// use OverwriteCheckIn type to make sure not to create multiple versions
newFile.CheckIn(string.Empty, CheckinType.OverwriteCheckIn);
Ответ 3
Еще один вариант загрузки файла на сайт SharePoint (включая SharePoint Online) с использованием метода File.SaveBinaryDirect:
/// <summary>
/// Uploads the specified file to a SharePoint site
/// </summary>
/// <param name="context">SharePoint Client Context</param>
/// <param name="listTitle">List Title</param>
/// <param name="fileName">File Name</param>
private static void UploadFile(ClientContext context, string listTitle,string fileName)
{
using (var fs = new FileStream(fileName, FileMode.Open))
{
var fi = new FileInfo(fileName);
var list = context.Web.Lists.GetByTitle(listTitle);
context.Load(list.RootFolder);
context.ExecuteQuery();
var fileUrl = String.Format("{0}/{1}", list.RootFolder.ServerRelativeUrl, fi.Name);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(context, fileUrl, fs, true);
}
}
Ответ 4
Я обнаружил, что часть сообщения delax, которая обновляет новые атрибуты/столбцы файла, не будет работать, вот еще одна версия, которая даже встраивается в пользовательскую библиотеку infopath с продвинутым полем:
public string AddNewForm(string WebUrl, string NewTitle)
{
string strMsg = "";
if (string.IsNullOrEmpty(WebUrl))
return EmptyProcURL;
try
{
// Starting with ClientContext, the constructor requires a URL to the server running SharePoint.
using (ClientContext client = new ClientContext(WebUrl))
{
//client.Credentials = System.Net.CredentialCache.DefaultCredentials;
// Assume that the web site has a library named "FormLibrary".
var formLib = client.Web.Lists.GetByTitle("FormLibrary");
client.Load(formLib.RootFolder);
client.ExecuteQuery();
// FormTemplate path, The path should be on the local machine/server !
string fileName = @"D:\Projects\FormTemplate.xml";
var fileUrl = "";
//Craete FormTemplate and save in the library.
using (var fs = new FileStream(fileName, FileMode.Open))
{
var fi = new FileInfo("newForm.xml");
fileUrl = String.Format("{0}/{1}", formLib.RootFolder.ServerRelativeUrl, fi.Name);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(client, fileUrl, fs, true);
}
// Get library columns collection.
var libFields = formLib.Fields;
client.Load(libFields);
client.ExecuteQuery();
Microsoft.SharePoint.Client.File newFile = client.Web.GetFileByServerRelativeUrl(fileUrl);
ListItem item = newFile.ListItemAllFields;
// Here the index of Title column is 9, you may use this format to update any column (even promoted fields).
// To find the index of interested column you should inspect libFields at debug mode, look in the libFields.Fields collection to find the index!
item[libFields[9].StaticName] = NewTitle ;
item.Update();
client.ExecuteQuery();
}
}
catch (Exception ex)
{
strMsg = ex.Message;
}
return strMsg;
}
Ответ 5
Я разработал следующий код, он работает нормально.
static void Main(string[] args)
{
try
{
using (ClientContext client = new ClientContext("https://sharepoint2018/sites/demos"))
{
string passWd = "password";
SecureString securePassWd = new SecureString();
foreach (var c in passWd.ToCharArray())
{
securePassWd.AppendChar(c);
}
client.Credentials = new SharePointOnlineCredentials("username", securePassWd);
var formLib = client.Web.Lists.GetByTitle("Documents");
client.Load(formLib.RootFolder);
client.ExecuteQuery();
string fileName = @"C:\demo.txt"; // FilePath
var fileUrl = "";
using (var fs = new FileStream(fileName, FileMode.Open))
{
var fi = new FileInfo("demo.txt"); //file Title
fileUrl = String.Format("{0}/{1}", formLib.RootFolder.ServerRelativeUrl, fi.Name);
Microsoft.SharePoint.Client.File.SaveBinaryDirect(client, fileUrl, fs, true);
client.ExecuteQuery();
}
var libFields = formLib.Fields;
client.Load(libFields);
client.ExecuteQuery();
Microsoft.SharePoint.Client.File newFile = client.Web.GetFileByServerRelativeUrl(fileUrl);
ListItem item = newFile.ListItemAllFields;
item.Update();
client.ExecuteQuery();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadKey();
}
}
Спасибо,
Sudhakar