#sharepoint #sharepoint-online #csom #file-properties
#sharepoint #sharepoint-online #csom #файл-свойства
Вопрос:
Я искал и нашел несколько примеров того, как это сделать, но я не могу заставить их работать — ну, часть этого не работает. Я могу выполнить загрузку файла, но следующая попытка изменить свойства завершается неудачей.
Я пытаюсь загрузить файл из полезной нагрузки base64 — эта часть работает, но когда я впоследствии пытаюсь отредактировать свойства (пользовательский столбец), связанные с файлом, код завершается с ошибкой.
Вот код (упрощенный для удобства чтения): (обратите внимание, что props — это набор пользовательских объектов (FileProperty) с атрибутом name и value).
using (ClientContext context = new ClientContext("<sharepoint_server_url>"))
{
context.Credentials = new SharePointOnlineCredentials(<usr>,<secure_pwd>);
using (System.IO.MemoryStream ms = new System.IO.MemoryStream(Convert.FromBase64String(<base64_content>)))
{
File.SaveBinaryDirect(context, <relative_path>, ms, true);
}
// file is uploaded - so far so good!
// attempt to edit properties of the file.
if (props != null)
{
if (props.Count > 0)
{
File newFile = context.Web.GetFileByServerRelativeUrl(<relative_path>);
context.Load(newFile);
context.ExecuteQuery();
newFile.CheckOut();
ListItem item = newFile.ListItemAllFields;
foreach (FileProperty fp in props)
{
item[fp.name] = fp.value;
}
item.Update();
newFile.CheckIn(string.Empty, CheckinType.OverwriteCheckIn);
}
}
}
Этот код выдает исключение в той части, где я пытаюсь обновить свойства.
Сообщение: файл не найден.
Кто-нибудь может сказать мне, что не так с этим примером, или предоставить другой пример того, как это сделать?
Кроме того, вопрос — есть ли способ адресовать файл по уникальному идентификатору, который является одинаковым независимо от того, где на сервере SharePoint находится или перемещается файл?
Я надеюсь, что кто-нибудь сможет мне помочь — спасибо 🙂
Комментарии:
1. Я также попытался добавить контекст. ExecuteQuery(); в конце концов, но это не имеет никакого значения.
2. Кроме того, чтобы уточнить — файл загружен и виден в браузере при просмотре местоположения. Это только попытка изменить свойства, которая завершается неудачей из-за того, что файл не найден.
Ответ №1:
Хорошо, я нашел решение своей проблемы. Я не знаю, почему это работает лучше, это просто так. Насколько я знаю, я делаю то же самое, только по-другому — может быть, кто-то еще, кто знает о SharePoint больше, чем я (что не так много), может объяснить, почему это работает, в то время как первый пример, который я опубликовал, не работает.
Перед показанным кодом я гарантирую, что <site_url> не заканчивается на «/», <имя_библиотеки> не начинается и не заканчивается на «/», а <имя_файла> не начинается и не заканчивается на «/». С помощью приведенного ниже кода я могу загрузить файл и обновить свойства, в моем случае я изменил «Заголовок» и пользовательский столбец «CustCulomnA», и он работает.
using (ClientContext context = new ClientContext(<site_url>))
{
context.Credentials = new SharePointOnlineCredentials(<usr>, <secure_pwd>);
FileCreationInformation fci = new FileCreationInformation()
{
Url = <file_name>,
Content = Convert.FromBase64String(<base64_content>),
Overwrite = true
};
Web web = context.Web;
List lib = web.Lists.GetByTitle(<library_name>);
lib.RootFolder.Files.Add(fci);
context.ExecuteQuery();
response.message = "uploaded";
if (props != null)
{
if (props.Count > 0)
{
File newFile = context.Web.GetFileByUrl(<site_url> "/" <library_name> "/" <file_name>);
context.Load(newFile);
context.ExecuteQuery();
newFile.CheckOut();
ListItem item = newFile.ListItemAllFields;
foreach (FileProperty fp in props)
{
item[fp.name] = fp.value;
}
item.Update();
newFile.CheckIn(string.Empty, CheckinType.OverwriteCheckIn);
context.ExecuteQuery();
Комментарии:
1. Да, структура URL-адреса файла должна быть siteurl/libraryname/filename , и я видел фрагмент кода выше, новый файл должен быть действительным сейчас. Рад это слышать, и вы могли бы принять это как ответ сейчас, чтобы это могло также помочь другим на форуме 🙂
Ответ №2:
Убедитесь, что относительный URL-адрес файлового сервера действителен в этом случае.
Например, если полный URL-адрес:
https://zheguo.sharepoint.com/sites/test/Shared Documents/test.jpg
Затем относительный URL-адрес должен быть
/sites/test/Shared Documents/test.jpg
И вы также можете использовать метод GetFileByUrl, передавая полный URL-адрес файла следующим образом:
clientContext.Credentials = new SharePointOnlineCredentials(userName, securePassword);
Web web = clientContext.Web;
clientContext.Load(web);
clientContext.ExecuteQuery();
File file = web.GetFileByUrl("https://zheguo.sharepoint.com/sites/test/Shared Documents/test.jpg");
clientContext.Load(file);
clientContext.ExecuteQuery();
file.CheckOut();
ListItem item = file.ListItemAllFields;
item["Title"] = "Test";
item.Update();
file.CheckIn(string.Empty, CheckinType.OverwriteCheckIn);
clientContext.ExecuteQuery();
}
Комментарии:
1. Мой относительный URL правильный — он используется в коде для создания файла, и я записываю его просто для проверки правильности. Но я постараюсь использовать подход полного пути и посмотреть, имеет ли это какое-либо значение.
2. Хорошо, я попробовал этот подход сейчас, и результат тот же, файл загружается просто отлично, но после этого файл не найден. Проблема в том, что я использую тот же ClientContext для извлечения файла для редактирования, который использовался для его создания чуть выше в коде? — Я не создаю новый ClientContext, а повторно использую тот, который у меня уже есть.
3. @Aidal, ClientContext для загрузки файла и получения файла должен быть одинаковым.