使用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飞?

+0

您是否找到了解决方案?我有完全一样的问题。我正在尝试上传已经在缓冲区中的文件的内容。我也不想将它写回文件以便将其作为文件上传。 – 2012-10-16 20:28:18

在致电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);