Как лучше всего загрузить файл в библиотеку документов на сервере SharePoint через встроенные веб-службы, предоставляемые версией WSS 3.0?
После двух начальных ответов ...
Нам определенно нужно использовать уровень веб-сервисов, поскольку мы будем делать эти вызовы из удаленных клиентских приложений.
Для нас подойдет метод WebDAV, но мы предпочли бы согласовываться с методом интеграции веб-сервисов.
There is additionally a web service to upload files, painful but works all the time.
Вы имеете в виду услугу «Копирование»?
Мы добились успеха с методом CopyIntoItems этой службы. Будет ли это рекомендованным способом загрузки файла в библиотеки документов с использованием только API веб-службы WSS?
Я разместил наш код в качестве предлагаемого ответа.





От коллеги по работе:
Lazy way: your Windows WebDAV filesystem interface. It is bad as a programmatic solution because it relies on the WindowsClient service running on your OS, and also only works on websites running on port 80. Map a drive to the document library and get with the file copying.
There is additionally a web service to upload files, painful but works all the time.
I believe you are able to upload files via the FrontPage API but I don’t know of anyone who actually uses it.
Не уверен, какую именно веб-службу использовать, но если у вас есть возможность использовать библиотеки DLL SharePoint .NET API, то использовать SPList и SPLibrary.Items.Add действительно просто.
Понятия не имею, почему за это проголосовали: «Нам определенно нужно использовать уровень веб-сервисов, поскольку мы будем делать эти вызовы из удаленных клиентских приложений».
@MichaelBlackburn Потому что, если вы посмотрите на историю вопроса, это уточнение не было добавлено к вопросу до тех пор, пока я не опубликовал свой ответ.
Ах, мои извинения.
Пример использования веб-службы WSS «Копировать» для загрузки документа в библиотеку ...
public static void UploadFile2007(string destinationUrl, byte[] fileData)
{
// List of desination Urls, Just one in this example.
string[] destinationUrls = { Uri.EscapeUriString(destinationUrl) };
// Empty Field Information. This can be populated but not for this example.
SharePoint2007CopyService.FieldInformation information = new
SharePoint2007CopyService.FieldInformation();
SharePoint2007CopyService.FieldInformation[] info = { information };
// To receive the result Xml.
SharePoint2007CopyService.CopyResult[] result;
// Create the Copy web service instance configured from the web.config file.
SharePoint2007CopyService.CopySoapClient
CopyService2007 = new CopySoapClient("CopySoap");
CopyService2007.ClientCredentials.Windows.ClientCredential =
CredentialCache.DefaultNetworkCredentials;
CopyService2007.ClientCredentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Delegation;
CopyService2007.CopyIntoItems(destinationUrl, destinationUrls, info, fileData, out result);
if (result[0].ErrorCode != SharePoint2007CopyService.CopyErrorCode.Success)
{
// ...
}
}
Вы обнаружили какие-либо проблемы с ошибками, когда файл уже существует? Я начал использовать эту технику, но обнаружил, что постоянно получаю сообщение об ошибке «Невозможно создать элемент в запрошенном месте назначения. Убедитесь, что папка существует и у вас есть разрешение на ее редактирование». У кого-нибудь еще была эта проблема?
ОБНОВЛЕНИЕ - если destinationUrl совпадает с URL-адресом внутри destinationUrls [], выдается указанная выше ошибка, если файл / элемент уже существует .... (rant: почему мы не можем редактировать комментарии ?!)
Нет, у меня никогда не было таких проблем. Это ваша классическая ошибка "неправильный пункт назначения", но если вы уверены, что пункт назначения правильный и у вас есть разрешение, я не могу понять, что еще могло быть причиной этого.
Можете ли вы развернуть это, чтобы показать, как это называть? В частности, каким должен быть параметр URL назначения?
Мне повезло с использованием описанного здесь класса-оболочки DocLibHelper: http://geek.hubkey.com/2007/10/upload-file-to-sharepoint-document.html
Другой вариант - использовать обычный HTTP PUT:
WebClient webclient = new WebClient();
webclient.Credentials = new NetworkCredential(_userName, _password, _domain);
webclient.UploadFile(remoteFileURL, "PUT", FilePath);
webclient.Dispose();
Где remoteFileURL указывает на вашу библиотеку документов SharePoint ...
Однако согласитесь с Erik E, чтобы затем обновить метаданные, вам нужно будет создать другую версию (где включено управление версиями для библиотеки документов). Если вы это сделаете, первой версией будет версия 2 (или 0.2).
Не уверен, что это правда, поскольку я не думаю, что «PUT» проверит файл, если включено управление версиями. Кроме того, должна быть возможность обновлять метаданные без создания новой версии с помощью метода SPListItem.SystemUpdate () ...
Требуется ли для этого изменить разрешения по умолчанию в IIS? При этом я получаю исключение 403 Forbidden.
где я могу импортировать все предопределенные классы?
Следует учесть несколько моментов:
Для CopyIntoItems исходный URL-адрес носит исключительно информационный характер. Биты не поступают с какого-то другого сервера.
Судя по результатам моего сегодняшнего тестирования, пуля №1 неверна. Вы можете загрузить совершенно новый документ на сервер с помощью Copy.CopyIntoItems.
Ты прав. Я обновил ответ, обратите внимание на проблему максимального размера.
public static void UploadFile(byte[] fileData) {
var copy = new Copy {
Url = "http://servername/sitename/_vti_bin/copy.asmx",
UseDefaultCredentials = true
};
string destinationUrl = "http://servername/sitename/doclibrary/filename";
string[] destinationUrls = {destinationUrl};
var info1 = new FieldInformation
{
DisplayName = "Title",
InternalName = "Title",
Type = FieldType.Text,
Value = "New Title"
};
FieldInformation[] info = {info1};
var copyResult = new CopyResult();
CopyResult[] copyResults = {copyResult};
copy.CopyIntoItems(
destinationUrl, destinationUrls, info, fileData, out copyResults);
}
ПРИМЕЧАНИЕ: Изменение 1-го параметра CopyIntoItems на имя файла, Path.GetFileName(destinationUrl), приводит к исчезновению сообщения об отмене связи.
Word, Excel (и другие приложения Office) используют FrontPage API, как и многие другие. В версии 2010 будет поддерживаться CMIS.