PUT文件(内容)与PHP和cURL

时间:2012-09-14 09:02:25

标签: php file-upload curl put

我正在尝试使用cURL和PUT方法上传文件,我已经有一个使用fsockopen工作的函数,但我想将它迁移到cURL。

使用fsockopen的函数接收文件的内容,文件名和auth的凭据并发出请求:

function put_file($content, $filename, $username, $pass)
{
    $header = "PUT /upload?username=".urlencode(user_name)."&passwd=".urlencode($pass)."&filename=".urlencode($file_name)." HTTP/1.0\r\n";
    $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $header .= "Content-Length: " . strlen($content) . "\r\n\r\n";
    $fp = @fsockopen("ssl://URL", 443, $errno, $errstr, 30);
    if(!$fp)
    {
        return "ERROR";
    }
    else
    {
        fputs ($fp, $header.$content);
        while (!feof($fp))
        {
            $res .= fread ($fp, 1024);
        }
        fclose($fp);
    }
}

我一直在尝试将该功能迁移到cURL,但我不知道如何在不需要在我的文件系统上安装“真实”文件的情况下执行此操作。我知道的唯一cURL选项是CURLOPT_INFILE和CURLOPT_INFILESIZE,但我没有该文件(并且不想将其写入磁盘并在打开后)。

我需要的是发送文件的“内容”,就像fsockopen版本一样。如何用cURL实现这一目标?

先谢谢你。

1 个答案:

答案 0 :(得分:2)

您可以使用php://temp包装器,它是PHP中的临时文件流。

首先将数据写入流中(不要忘记使用rewind(),以便cURL读取所有数据):

$fp = fopen("php://temp", "r+");
fputs($fp, $content);
rewind($fp);

然后在设置cURL时只需使用:

curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, strlen($content)); #adding missing bracket

最后关闭临时文件处理程序(可选):

fclose($fp);