使用php和curl将文本作为文件上传为POST(multipart / form-data)

时间:2009-05-22 12:04:09

标签: php post file-upload curl

我正在尝试实现的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动态上传文本作为文件?

2 个答案:

答案 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);