使用cURL发布文件不会在路径的开头使用@

时间:2016-06-08 21:41:12

标签: php file post curl

所以我尝试使用cURL和其他POST变量将文件发送到另一个页面。除文件发送外,其中大部分都有效。但它只能在我的localhost上运行。当它上传到托管的Web服务器时,它的工作方式与它应该完全一样。

我也不想使用CURLFile,因为网络服务器不支持它。

以下是代码:

        // Output the image
        imagejpeg($fileData['imageBackground'], $newFileName, 75);

        // Get Old Background
        $query['getBackground'] = $this->PDO->prepare("SELECT backgroundImage FROM accounts WHERE token = :token");
        $query['getBackground']->execute(array(':token' => $token));

        $queryData = $query['getBackground']->fetch(PDO::FETCH_ASSOC);

        $verificationKey = self::newVerificationKey($token);
        // Send the file to the remote
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $uploadURL);
        curl_setopt($ch, CURLOPT_POST, true);
        $postArgs = array(
                'action' => 'updateBackground',
                'verificationKey' => $verificationKey,
                'file' => '@' . realpath($newFileName),
                'oldBackground' => $queryData['backgroundImage']
            );
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postArgs);
        curl_setopt($ch, CURLOPT_SAFE_UPLOAD, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        curl_close($ch);
        unlink($newFileName);

提前致谢!

1 个答案:

答案 0 :(得分:0)

您的网络服务器很可能正在运行支持“@”的旧版本,但不支持curlfile。您的本地计算机支持curlfile - 但不支持“@”(在默认配置中)...

您可以使用

if (class_exists("CurlFile")){
   $postArgs = array(
                'action' => 'updateBackground',
                'verificationKey' => $verificationKey,
                'file' => new CurlFile($newFileName),
                'oldBackground' => $queryData['backgroundImage']
            );
}else{
 $postArgs = array(
                'action' => 'updateBackground',
                'verificationKey' => $verificationKey,
                'file' => '@' . realpath($newFileName),
                'oldBackground' => $queryData['backgroundImage']
            );
}
建议使用

,因为@ - 方式被认为是不安全的,因此请在可用时使用CurlFile

然而,要让@ - 方式工作lokaly,你可以使用

curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);

在PHP 5.5之前默认为false,但对于更高版本,默认为true

注意,使用“订单”播放arround。 CURLOPT_POSTFIELDS似乎存在一个问题,即对现有选项有些敏感。所以

curl_setopt($ch, CURLOPT_POSTFIELDS, $postArgs);
curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);

可能不起作用,而

curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postArgs);

可能。