使用php和curl将文本上传为带有POST(multipart/form-data)的文件
问题描述:
我试图实现的API需要上载包含命令的XML文件。 最简单的方法就是生成文件的内容,将其写入文件系统并使用curl将其上传到Web服务器。使用php和curl将文本上传为带有POST(multipart/form-data)的文件
我想完成的是使用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显示没有请求正在发送。 更新:结果我得到的是:
result:
error:failed creating formpost data
有谁有一个线索,如何上传文本文件作为与PHP飞?
答
在致电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。
答
可能是因为在写入$fp
之后,文件句柄的指针指向文件的末尾。你有没有试过先倒带?
fseek($fp, 0, SEEK_SET);
您是否找到了解决方案?我有完全一样的问题。我正在尝试上传已经在缓冲区中的文件的内容。我也不想将它写回文件以便将其作为文件上传。 – 2012-10-16 20:28:18