使用基于SOAP api的base64Binary的PHP创建文件

时间:2013-09-12 19:09:43

标签: php api pdf soap

原谅我对SOAP的不熟悉。我的任务是保存通过第三方供应商的SOAP API提供给我们的多个pdf文件到我们的网络服务器。 供应商API的结果以

提供
    xsd:element name="content" type="xsd:base64Binary" 

我已经达到了这样的程度,我可以使用php将pdf输出到浏览器而不会出现以下代码:

    $document=$vendor_soap_client->getPersonDocument($pid);  
    $filename= $name . $extension;  
    header("Content-type: " . $document->mime);  
    header("Content-Disposition: attachment; filename=" . $name. $extension);  
    print($document->content);

我假设从base64Binary类型的结果,我需要base64_decode。这只是给我的输出留下了一堆符号。我尝试将结果转换为字符串,然后保存为pdf。这让我更接近,至少pdf的文本写入文件,但原始格式不是,这是预期的。那么,我如何从API中获取原始pdf并将其保存到我们自己的网络服务器中?作为一个FYI - 是的,pdf的内容是我们的,我们可以下载它。我不是在这里尝试任何狡猾的事情。我只是迷失了如何从上面到我们的服务器上的pdf。现在,下一个明显的选择是执行上述操作,并一次保存每个pdf。可行,但繁重。

更新: XSD:

    <xsd:complexType name="DocumentObject">
  <xsd:all>  
   <xsd:element name="student_document_id" type="xsd:string" nillable="true"/>  
   <xsd:element name="document_label" type="xsd:string" nillable="true"/>
   <xsd:element name="document_type" type="xsd:string" nillable="true"/>
   <xsd:element name="mime" type="xsd:string" nillable="true"/>
   <xsd:element name="size" type="xsd:integer" nillable="true"/>
   <xsd:element name="content" type="xsd:base64Binary" nillable="true"/>
   <xsd:element name="private" type="xsd:boolean" nillable="false"/>
   <xsd:element name="created" type="xsd:dateTime" nillable="false"/>
   <xsd:element name="modified" type="xsd:dateTime" nillable="false"/>
   <xsd:element name="approved" type="xsd:boolean" nillable="false"/>
   <xsd:element name="link" type="xsd:string" nillable="true"/>
   <xsd:element name="student_id" type="xsd:string" nillable="true"/>
   <xsd:element name="match_context" type="xsd:string" nillable="true"/>
   <xsd:element name="reviewed_date" type="xsd:dateTime" nillable="true"/>
   <xsd:element name="review_status" type="xsd:string" nillable="true"/>
   <xsd:element name="review_comment" type="xsd:string" nillable="true"/>
   <xsd:element name="reviewed_by" type="xsd:string" nillable="true"/>
   <xsd:element name="resubmitted" type="xsd:boolean" nillable="true"/>
  </xsd:all>  

这就是你要求的吗?

执行file_put_contents的结果如下:

  

%PDF-1.5       %μμμμ       1 0 obj       &LT;&GT;&GT;&GT;       endobj       2 0 obj       &LT;&GT;       endobj       3 0 obj       &LT;&GT; / x对象&LT;&GT; / ProcSet [/ PDF /文本/ ImageB / ImageC / ImageI]

     
    
      

/ Annots [9 0 R 12 0 R] / MediaBox [0 0 612 792] /目录4 0 R /组&lt;&gt; / Tabs / S / StructParents       0 GT;&GT;           endobj           4 0 obj           &LT;&GT;           流           xœμ= k“ÛÆ'ßU¥ÿ€IŠL¼æçÚº•Vr”xíÄR“«RîÍ...visÞ%¥(u?þ| {0 /

    
  

更新:嗯,事实证明用户错误是一个大问题。做一个fopen和fwrite就可以了,这是我尝试过的第一件事。但是,我使用WinScp来查看服务器上的文件,以确保它们正在被编写...但我也没有考虑使用它来实际查看pdfs的后果!所以,他们一直都是正确的。非常感谢你的回复!

1 个答案:

答案 0 :(得分:2)

看起来$document->content只是原始文件数据 - 未编码或任何内容。如果是这样的话,这应该可以解决问题:

file_put_contents($filename, $document->content);

如果没有,您是否可以提供指向Web服务的完整XSD的链接?