2

我正在尝试将文档上传到 iOS 中 Sharepoint 的文档库,但成功有限。

我已经使用Copy.CopyIntoItems至少让我的文档出现在目标文档库中,使用这个肥皂请求:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <CopyIntoItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">
      <SourceUrl>[server url]</SourceUrl>
      <DestinationUrls><string>[server url]</string></DestinationUrls>
      <Fields></Fields>
      <Stream>[base 64 encoded string]</Stream>
    </CopyIntoItems>
  </soap:Body>
</soap:Envelope>

这让我至少可以让我的文档出现在我的图书馆中。但是,响应没有给我任何关于它们的元数据(如 GUID 等),这使得我更难管理。此外,在浏览器中查看项目时,我还有其他操作选项,例如“查看源项目”,以及删除额外提示时指出“该项目是从另一个位置复制的......”。由于使用 SharePoint 的主要是 Bob,这只会使他们感到困惑。理想情况下,文档的操作看起来与直接通过浏览器中的文档库上传时的操作相同。透明度越高越好。

我在网上看到的另一个常见解决方案是结合使用Lists.UpdateListItems和 Lists.AddAttachment。我已经让 Lists.UpdateListItems 正常工作并创建了一个新条目(这很好,因为它可以像 GUID 一样返回元数据,并且至少乍一看看起来与表单上传的文档相同)。但是, Lists.AddAttachment 对我不起作用。对 AddAttachment 使用此 SOAP 请求(GUID 是带有 UpdateListItems 的新添加项目的 GUID):

<?xml version="1.0" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soap:Body>
    <AddAttachment xmlns="http://schemas.microsoft.com/sharepoint/soap/">
      <listName>Test</listName>
      <listItemID>{1F214D95-B92B-4E10-8B96-4B04DC6DA9B6}</listItemID>
      <fileName>screenshot.png</fileName>
      <attachment>[base 64 string]</attachment>
    </AddAttachment>
  </soap:Body>
</soap:Envelope>

我得到以下回复:

<?xml version="1.0" ?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <soap:Body>
    <soap:Fault>
      <faultcode>
        soap:Server
      </faultcode>
      <faultstring>
        Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.
      </faultstring>
      <detail>
        <errorstring xmlns="http://schemas.microsoft.com/sharepoint/soap/">
          Input string was not in a correct format.
        </errorstring>
      </detail>
    </soap:Fault>
  </soap:Body>
</soap:Envelope>

有任何想法吗?我确定我在某个地方走错了路,我只是不确定在哪里。谢谢!

4

1 回答 1

1

今天早上开始工作了。我最终采用了最简单的方法,老实说,我从未想过它会与 Microsoft API 一起使用。

NSString *fullPath = @"https://site/library/folders/document.txt";
NSURL *url = [NSURL URLWithString: fullPath];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
request.HTTPMethod = @"PUT";
request.HTTPBody = [NSData {documentData}];

//this is the authentication Cookie acquired in a previous request.
[request addValue:cookie forHTTPHeaderField:@"Cookie"];
[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

关键似乎是使用 PUT 作为方法。

重要的是要注意,不幸的是,这会受到上述返回的元数据有限的问题的影响,但由于这种行为与直接通过 SharePoint 网站上传非常相似,所以我认为这没问题。我可能只是要重新设计我决定是否下载/更新现有文档的逻辑。

于 2012-04-10T12:47:14.717 回答