【问题标题】:Creating a file using PHP based on base64Binary from SOAP api从 SOAP api 使用基于 base64Binary 的 PHP 创建文件
【发布时间】:2013-09-17 07:48:06
【问题描述】:

请原谅我对 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 对象 >> 结束对象 2 0 对象 结束对象 3 0 对象 /XObject/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]

/Annots[9 0 R 12 0 R] /MediaBox[0 0 612 792] /Contents 4 0 R/Group/Tabs/S/StructParents 0>> 结束对象 4 0 对象 溪流 xœµ=k“ÛÆ‘ßU¥ÿ€IŠL¼æ çÚº•Vr”xíÄR'«RîÍ...visÞ%¥(u?þ¦{0/

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

【问题讨论】:

    标签: php api pdf soap


    【解决方案1】:

    看起来$document-&gt;content 只是原始文件数据——没有编码或任何东西。如果是这样的话,这应该可以解决问题:

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

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

    【讨论】:

    • 遗憾的是没有。这也会产生垃圾。你想要这个吗?
    • 对不起...新用户。我的意思是添加代码,而不是那样结束评论。
    • 感谢 XSD;不幸的是,它对反思并没有真正的帮助。你在使用 SoapClient 吗?它为你解码base64,所以我有点困惑:stackoverflow.com/questions/16893934/…
    • 供应商确实有一个我们调用的 SoapClient。我之前在研究时看到过那个帖子。我确定我遗漏了一些明显的东西,因为我不熟悉 SOAP。
    猜你喜欢
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多