Загрузить файл в SharePoint через встроенные веб-сервисы - PullRequest
31 голосов
/ 28 августа 2008

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

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

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

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

Существует также веб-сервис для загрузки файлов, болезненно, но работает все время.

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

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

Ответы [ 7 ]

17 голосов
/ 29 августа 2008

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

Другой вариант - использовать обычный HTTP PUT:

WebClient webclient = new WebClient();
webclient.Credentials = new NetworkCredential(_userName, _password, _domain);
webclient.UploadFile(remoteFileURL, "PUT", FilePath);
webclient.Dispose();

Где remoteFileURL указывает на вашу библиотеку документов SharePoint ...

8 голосов
/ 06 сентября 2008

Есть несколько вещей, которые следует учитывать:

  • Copy.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, но этот новый веб-сервис должен быть установлен на сервере. Это может сохранить поездки на сервер.
6 голосов
/ 21 сентября 2010
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), сообщение об отмене связи исчезает.

4 голосов
/ 30 августа 2008

Мне повезло, используя описанный здесь класс-оболочку DocLibHelper: http://geek.hubkey.com/2007/10/upload-file-to-sharepoint-document.html

1 голос
/ 29 августа 2008

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

1 голос
/ 28 августа 2008

Из колледжа на работе:

Ленивый способ: интерфейс вашей файловой системы Windows WebDAV. Это плохое программное решение, поскольку оно опирается на службу WindowsClient, работающую в вашей ОС, а также работает только на веб-сайтах, работающих на порту 80. Подключите диск к библиотеке документов и получите с копированием файла.

Существует также веб-сервис для загрузки файлов, болезненный, но работает постоянно.

Я полагаю, что вы можете загружать файлы через API FrontPage, но я не знаю никого, кто бы его использовал.

...