我正在尝试实现的API需要上传包含命令的XML文件。 直接的方法是生成文件的内容,将其写入文件系统并使用curl将其上传到Web服务器。
我想要完成的是通过使用php的临时协议处理程序跳过写入部分。示例代码如下:
<?php
$fp = fopen("php://temp", "r+");
$request = 'some xml here';
fwrite($fp, $request);
rewind($fp);
$input_stat = fstat($fp);
$size = $input_stat['size'];
$url = "http://example.com/script.php";
$ch = curl_init();
$filename = $_POST[cert_file] ;
$data['file'] = "@xml.xml";
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
curl_setopt($ch,CURLOPT_INFILESIZE,$size);
curl_setopt($ch,CURLOPT_INFILE,$fp);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
$result = curl_exec($ch);
$error = curl_error($ch);
echo 'result:'.$result."\n";
echo 'error:'.$error."\n";
curl_close($ch);
?>
不幸的是,这不起作用。 Tcpdump显示没有请求发送。 更新:我得到的结果是:
结果:
错误:创建formpost数据失败
有没有人有线索,如何使用PHP动态上传文本作为文件?
答案 0 :(得分:1)
致电fwrite
后,请致电rewind($fp)
。在fwrite
之后,文件指针位于临时流的末尾。如果您致电rewind
,则会将其重置为开头。以下是PHP会话的快速证明:
php > $fp = fopen("php://temp", "r+"); php > fputs($fp, "<xml>some xml</xml>\n"); php > echo stream_get_contents($fp); php > rewind($fp); php > echo stream_get_contents($fp); <xml>some xml</xml> php > exit
在第一个回声stream_get_contents
之后,没有回音。在rewind
之后,stream_get_contents
的第二个回显显示了XML。
答案 1 :(得分:1)
可能是因为,在写入$fp
之后,文件句柄的指针指向文件的末尾。你有没有尝试过重绕它?
fseek($fp, 0, SEEK_SET);