从 SOAP API 使用 PHP 基于 base64Binary 创建一个文件


Creating a file using PHP based on base64Binary from SOAP api

请原谅我对 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 并将其保存到我们自己的网络服务器中呢? 仅供参考 - 是的,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 <>>> 恩多布吉 2 0 obj <> 恩多布吉 3 0 obj <>/XObject<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]

/Annots[ 9 0 R 12 0 R]/MediaBox[ 0 0 612 792]/内容 4 0 R/group<>/tabs/s/StructParents 0>> 恩多布吉 4 0 obj <> 流 xœμ=k"ÛÆ'ßU¥ÿ€IŠL1/4æ çÚº•Vr"xíÄR'«RîÍ...visÞ%¥(u?þ¦{0/

更新:好吧,事实证明用户错误是这里的大问题。做一个fopen和fwrite做了这个技巧,这是我尝试的第一件事。 但是,我正在使用 WinScp 查看服务器上的文件,以确保它们正在写入......但我也没有考虑使用它实际查看 pdf 的后果!! 所以,他们一直都是对的。 非常感谢您的回复!

看起来$document->content只是原始文件数据 - 没有编码或任何东西。如果是这种情况,这应该可以解决问题:

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

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