Как загрузить файл с локального компьютера в Sharepoint с помощью Perl SOAP :: Lite? - PullRequest
3 голосов
/ 23 января 2012
#use SOAP::Lite ( +trace => all, maptype => {} );
use SOAP::Lite maptype => {};
use LWP::UserAgent;
use HTTP::Request::Common;

#credentials' file
require "c:\\test\\pass.pl";
my $userAgent = LWP::UserAgent->new(keep_alive => 1);

sub SOAP::Transport::HTTP::Client::get_basic_credentials {
    return $username => $password;
}
my $soap
  = SOAP::Lite
  ->uri('<mysite>/_vti_bin/lists.asmx')
  ->on_action(sub {join '/', 'http://schemas.microsoft.com/sharepoint/soap/CopyIntoItemsLocal', $_[1]})
  ->proxy('<mysite>/_layouts/viewlsts.aspx?BaseType=0', keep_alive => 1);

# my $method = SOAP::Data->name('CopyIntoItemsLocal')
# ->attr({xmlns => 'http://schemas.microsoft.com/sharepoint/soap/'});
# my @params =  (SOAP::Data->name(SourceUrl => $source),
# SOAP::Data->name(DestinationUrl => $destination) );
# print $soap->call($method => @params)->result;

my $fileName = 'c:\test\abc.txt';
my $destDir  = "<mysite>/Lists/sharepoint1/";

#load and encode Data
my $data;
open(FILE, $fileName) or die "$!";

#read in chunks of 57 bytes to ensure no padding in the middle (Padding means extra    space for large files)
while (read(FILE, $buf, 60 * 57)) {
    $data .= encode_base64($buf);
}
close(FILE);

#make the call
print "uploading $fileName...";
$lists = $soap->GetList();
my $method = SOAP::Data->name('CopyIntoItemsLocal')->attr({xmlns => 'http://schemas.microsoft.com/sharepoint/soap/'});
my @params = (
    SOAP::Data->name('SourceUrl')->value($fileName)->type(''),
    SOAP::Data->name('DestinationUrls')->type('')->value(
        \SOAP::Data->name('string')->type('')->value($destDir . $fileName)
    ),
    SOAP::Data->name('Fields')->type('')->value(
        \SOAP::Data->name('FieldInformation')->type('')->attr({Type => 'File'})->value('')
    ),
    SOAP::Data->name('Stream')->value("$data")->type('')

);

#print Results
print $soap->call($method => @params)->result;

#print $response->headerof('//CopyResult')->attr->{ErrorCode};
#use SOAP::Lite ( +trace => all, maptype => {} );
use SOAP::Lite maptype => {}; 
use LWP::UserAgent;
use HTTP::Request::Common;
use MIME::Base64 qw(encode_base64);
require "c:\\test\\pass.pl";
my $userAgent = LWP::UserAgent->new(keep_alive=>1);
#setup connection
sub SOAP::Transport::HTTP::Client::get_basic_credentials { 
 return $username => $password;
}
my $soap = SOAP::Lite
       -> uri('http://<mysite>')
       -> on_action( sub{ join '/', 'http://schemas.microsoft.com/sharepoint/soap',  $_[1] })
       -> proxy('http://<mysite>/_vti_bin/lists.asmx',keep_alive => 1);

$lists = $soap->GetListCollection();
quit(1, $lists->faultstring()) if defined $lists->fault();
my @result = $lists->dataof('//GetListCollectionResult/Lists/List');
foreach my $data (@result) {
    my $attr = $data->attr;
    foreach my $a qw'Title Description DefaultViewUrl Name ID WebId ItemCount' {
        printf "%-16s %s\n", $a, $attr->{$a};
    }
    print "\n";
}

Кажется, аутентификация работает.Сначала я подумал, что веб-сервис GetlistCollection работает, так как когда я звонил с помощью этого веб-сервиса, он возвращал страницу.Но я думаю, что вызов возвращает страницу, которую я указал в аргументе proxy.

Я могу получить список на определенном сайте на sharepoint.

Я использовалGetListCollection.Однако я не очень понял код, который печатает список.Я просто скопировал его с squish.net .Сейчас я пытаюсь использовать веб-сервис CopyIntoItemsLocal.

У нас есть хранилище файлов на одном сервере (SVN), и мне нужно написать сценарий Perl, который при выполнении будет копировать файлы и каталоги из SVN.поделиться с точки зрения структуры каталогов.

Буду признателен за любую помощь или советы.Поскольку это большая задача, я делаю ее в модулях.

1 Ответ

0 голосов
/ 03 апреля 2012

Я бы начал с использования soapUI (ранее eviware, теперь smartbear) - инструмента тестирования soapUI с открытым исходным кодом.Это позволит вам отправлять мыльные транзакции туда и обратно без какого-либо другого пользовательского интерфейса.Как только вы убедитесь, что ваши транзакции работают, и вы можете проанализировать данные, чтобы получить то, что вы хотите, я перейду к использованию Perl для автоматизации этих транзакций.

Это поможет вам устранить ошибки в ваших запросах на ранних этапах,выяснить, как анализировать ответы и ознакомиться с API.

...