我正在使用WSO2 WS Framework并设法运行示例,其中Web服务将图像作为MTOM附件返回,然后由客户端使用file_put_contents(...)命令保存。
服务
<?php
function sendAttachment($msg){
$responsePayloadString = <<<XML
<ns1:download xmlns:ns1="http://wso2.org/wsfphp/samples/mtom">
<ns1:fileName>test.jpg</ns1:fileName>
<ns1:image xmlmime:contentType="image/jpeg" xmlns:xmlmime="http://www.w3.org/2004/06/xmlmime">
<xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:myid1"></xop:Include>
</ns1:image>
</ns1:download>
XML;
$f = file_get_contents("test.jpg");
$responseMessage = new WSMessage($responsePayloadString,
array( "attachments" => array("myid1" => $f)));
return $responseMessage;
}
$operations = array("download" => "sendAttachment");
$service = new WSService(array("operations" => $operations, "useMTOM" => TRUE));
$service->reply();
?>
客户端:
<?php
$requestPayloadString = '<download></download>';
try {
$client = new WSClient(
array( "to" => "http://SPLINTER/MTOM/service.php",
"useMTOM" => TRUE,
"responseXOP" => TRUE));
$requestMessage = new WSMessage($requestPayloadString);
$responseMessage = $client->request($requestMessage);
printf("Response = %s \n", $responseMessage->str);
$cid2stringMap = $responseMessage->attachments;
$cid2contentMap = $responseMessage->cid2contentType;
$imageName;
if($cid2stringMap && $cid2contentMap){
foreach($cid2stringMap as $i=>$value){
$f = $cid2stringMap[$i];
$contentType = $cid2contentMap[$i];
if(strcmp($contentType,"image/jpeg") ==0){
$imageName = $i."."."jpg";
if(stristr(PHP_OS, 'WIN')) {
file_put_contents($imageName, $f);
}else{
file_put_contents("/tmp/".$imageName, $f);
}
}
}
}else{
printf("attachments not received ");
}
} catch (Exception $e) {
if ($e instanceof WSFault) {
printf("Soap Fault: %s\n", $e->Reason);
} else {
printf("Message = %s\n",$e->getMessage());
}
}
?>
而不是我想打开“保存对话框”以在打开或保存文件之间进行选择。在搜索解决方案时,我读到了关于设置标题的信息:
header('Content-type: application/octet-stream');
header('Content-disposition: attachment; filename="test.jpg"');
但它效果不佳。 “保存对话框”加速,但是当无法打开图像时说该文件为空。
实际上我不太了解这个MTOM附件是如何工作的。在客户端代码中,我认为$ f是一个字符串,当我执行printf($ f)时,它会打印0(零),那么如何将此字符串保存为图像?谢谢你的推荐!
答案 0 :(得分:0)
如果你想使用那些标题,你必须输出文件内容,而不是保存在某个地方。
header('Content-type: application/octet-stream');
header('Content-disposition: attachment; filename="test.jpg"');
// Output file. This must be the ONLY output of the whole script
echo $rawFileContents;
基础知识是,您现在将整个文件内容加载到变量中(在代码中似乎是$f
),您输出它而不是将其写入文件中(因为我认为您现在正在做。所以,我给你的三行代码应该替换file_put_contents()
调用。
相反,如果您想将文件保存在/tmp
文件夹中,确定,请执行此操作,然后再使用
header('Location: /tmp/' . $imageName);
通过这种方式,您可以将用户浏览器直接重定向到已保存的文件,并让用户随意使用它。