Загрузите файл в SharePoint через встроенные веб-службы

Как лучше всего загрузить файл в библиотеку документов на сервере SharePoint через встроенные веб-службы, предоставляемые версией WSS 3.0?

После двух начальных ответов ...

  • Нам определенно нужно использовать уровень веб-сервисов, поскольку мы будем делать эти вызовы из удаленных клиентских приложений.

  • Для нас подойдет метод WebDAV, но мы предпочли бы согласовываться с методом интеграции веб-сервисов.

There is additionally a web service to upload files, painful but works all the time.

Вы имеете в виду услугу «Копирование»? Мы добились успеха с методом CopyIntoItems этой службы. Будет ли это рекомендованным способом загрузки файла в библиотеки документов с использованием только API веб-службы WSS?

Я разместил наш код в качестве предлагаемого ответа.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
31
0
64 914
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

От коллеги по работе:

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.

Word, Excel (и другие приложения Office) используют FrontPage API, как и многие другие. В версии 2010 будет поддерживаться CMIS.

Lou Franco 21.05.2009 19:34

Не уверен, какую именно веб-службу использовать, но если у вас есть возможность использовать библиотеки DLL SharePoint .NET API, то использовать SPList и SPLibrary.Items.Add действительно просто.

Понятия не имею, почему за это проголосовали: «Нам определенно нужно использовать уровень веб-сервисов, поскольку мы будем делать эти вызовы из удаленных клиентских приложений».

Michael Blackburn 24.06.2016 19:00

@MichaelBlackburn Потому что, если вы посмотрите на историю вопроса, это уточнение не было добавлено к вопросу до тех пор, пока я не опубликовал свой ответ.

Daniel O 16.11.2016 07:56

Ах, мои извинения.

Michael Blackburn 16.11.2016 15:46
Ответ принят как подходящий

Пример использования веб-службы 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)
    {
        // ...
    }
}

Вы обнаружили какие-либо проблемы с ошибками, когда файл уже существует? Я начал использовать эту технику, но обнаружил, что постоянно получаю сообщение об ошибке «Невозможно создать элемент в запрошенном месте назначения. Убедитесь, что папка существует и у вас есть разрешение на ее редактирование». У кого-нибудь еще была эта проблема?

misteraidan 01.07.2009 04:05

ОБНОВЛЕНИЕ - если destinationUrl совпадает с URL-адресом внутри destinationUrls [], выдается указанная выше ошибка, если файл / элемент уже существует .... (rant: почему мы не можем редактировать комментарии ?!)

misteraidan 01.07.2009 04:15

Нет, у меня никогда не было таких проблем. Это ваша классическая ошибка "неправильный пункт назначения", но если вы уверены, что пункт назначения правильный и у вас есть разрешение, я не могу понять, что еще могло быть причиной этого.

Andy McCluggage 04.07.2009 17:45

Можете ли вы развернуть это, чтобы показать, как это называть? В частности, каким должен быть параметр URL назначения?

Robert MacLean 28.02.2010 15:01

Мне повезло с использованием описанного здесь класса-оболочки 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).

misteraidan 01.07.2009 08:04

Не уверен, что это правда, поскольку я не думаю, что «PUT» проверит файл, если включено управление версиями. Кроме того, должна быть возможность обновлять метаданные без создания новой версии с помощью метода SPListItem.SystemUpdate () ...

Jim Harte 01.07.2009 17:20

Требуется ли для этого изменить разрешения по умолчанию в IIS? При этом я получаю исключение 403 Forbidden.

Jeremy 01.12.2010 20:16

где я могу импортировать все предопределенные классы?

Shailendra Madda 10.02.2016 15:19

Следует учесть несколько моментов:

  • Копировать.CopyIntoItems требуется, чтобы документ уже присутствовал на каком-то сервере. Документ передается как параметр вызова веб-службы, который ограничивает размер документа. (См. http://social.msdn.microsoft.com/Forums/en-AU/sharepointdevelopment/thread/e4e00092-b312-4d4c-a0d2-1cfc2beb9a6c)
  • метод 'http put' (то есть webdav ...) только поместит документ в библиотеку, но не установит значения полей
  • для обновления значений полей вы можете вызвать Lists.UpdateListItem после 'http put'
  • библиотеки документов могут иметь каталоги, вы можете создавать их с помощью http mkcol
  • вы можете проверить файлы с помощью Lists.CheckInFile
  • вы также можете создать собственный веб-сервис, который использует SPxxx .Net API, но этот новый веб-сервис должен быть установлен на сервере. Это могло сэкономить поездки на сервер.

Для CopyIntoItems исходный URL-адрес носит исключительно информационный характер. Биты не поступают с какого-то другого сервера.

Tony Lee 19.03.2009 23:25

Судя по результатам моего сегодняшнего тестирования, пуля №1 неверна. Вы можете загрузить совершенно новый документ на сервер с помощью Copy.CopyIntoItems.

retrodrone 25.06.2011 02:08

Ты прав. Я обновил ответ, обратите внимание на проблему максимального размера.

ErikE 28.06.2011 20:50

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), приводит к исчезновению сообщения об отмене связи.

Другие вопросы по теме