Я пытаюсь загрузить файл из библиотеки Sharepoint через веб-сервис с клиентом nusoap. Я могу подключиться и получить список содержимого с помощью Lists.wsdl, но у меня возникают проблемы с определением параметров для методов Copy.wsdl.
<?php
require_once('lib/nusoap.php');
$username = 'domain\user';
$password = 'secret';
$rowLimit = '0';
$listGuid = "{0379989D-8639-430B-9FD0-96551B7EAB29}";
//Lists.wsdl copied from the Sharepoint site and stored on local drive
$wsdl = "http://localhost/sp/Lists.wsdl";
//NTLM authentication.
$client = new nusoap_client($wsdl, true);
$client->setCredentials('','','ntlm');
$client->useHTTPPersistentConnection();
$client->setCurlOption(CURLOPT_USERPWD, $username.':'.$password);
//XML for the request
$getItemsXml ='
<GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<listName>'.$listGuid.'</listName>
<rowLimit>'.$rowLimit.'</rowLimit>
</GetListItems>
';
//This works and returns requested data from a list
$result = $client->call('GetListItems', $getItemsXml);
$responseContent = substr($client->response,strpos($client->response, "<"),strlen($client->response)-1);//This part does not work
//Library ID
$fileGuid = "{A24306B5-50E9-44C0-9728-69E2D015B689}";
$cwsdl = "http://localhost/sp/Copy.wsdl";
$cclient = new nusoap_client($cwsdl, true);
$cclient->setCredentials('','','ntlm');
$cclient->useHTTPPersistentConnection();
$cclient->setCurlOption(CURLOPT_USERPWD, $username.':'.$password);
//This is where I get lost
$fileParams = array();
$cResult = array(0);
$fieldInformationCollection = array('fieldInformation'=>array('DisplayName'=>'', 'Id'=>'', 'InternalName'=>'', 'Type'=>'', 'Value'=>''));
$content = array('');
$fileParams[] = "http://site.example.com/subsite/folder/somefile.pdf";
$fileParams[] = $cResult;
$fileParams[] = $fieldInformation;
$fileParams[] = $content;
//This call fails
$result = $cclient->call('GetItem', $fileParams);
?>
Отладочная информация из неудачного вызова показывает, что некоторые параметры неверны, но я не могу понять это.
wsdl: in serializeType: uqType: GetItem, ns: http://schemas.microsoft.com/sharepoint/soap/, phptype: struct, arrayType:
wsdl: in serializeType: phpType is struct, but value is not an array
wsdl: in serializeType: returning:
wsdl: serializeRPCParameters returning:
nusoap_client: got wsdl error: phpType is struct, but value is not an array: see debug output for details
Я попытался прочитать (и понять) файл Copy.wsdl и завершить отладку, но без кубиков.
Кто-нибудь получил это работает? Благодарю.
Итак, после еще нескольких часов отладки я обнаружил, что ответ удивительно прост. Единственный параметр, который нужно отправить — это URL-адрес файла, который нужно загрузить следующим образом:
//Set URL of the file
$file['Url'] = 'http://site.example.com/subsite/Folder/requested_file.ext';
//Call nusoap client
$result = $cclient->call('GetItem', $file);
Параметр должен быть ассоциативным массивом с одним элементом под названием «Url».
Клиент вернет массив с элементами «GetItemResult» (в случае успеха равным 0), «Fields» (массив из 75 массивов с различной информацией о файле из библиотеки) и, наконец, «Stream», который содержит содержимое файла в кодировке Base64 в строка.
file_put_contents('c:/temp/requested_file.ext', base64_decode($result['Stream']));
Других решений пока нет …