php curl没有将文件保存到位置

时间:2013-04-03 14:46:13

标签: php curl laravel

我一整天都在寻找答案,但没有运气!

我想将图像从网络下载/复制到我服务器上的某个位置,下面的代码不能修剪除图像之外的任何错误,只是不保存到所需的目录或任何目录。

正如你所看到的,我正在使用cURL获取图像,变量$ contents返回true(1)所以我假设脚本有效,但我实际上缺少了一些东西。

非常感谢您的帮助。 : - )

    $dir = URL::base() . "/img/products/";

    $imgSrc = "an image on the web";

    $file = fopen($dir, "wb");

    $headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';              
    $headers[] = 'Connection: Keep-Alive';         
    $headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';         
    $user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';  

    $ch = curl_init($imgSrc);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);         
    curl_setopt($ch, CURLOPT_HEADER, 0);         
    curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); 
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FILE, $file); // location to write to
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
    $contents = curl_exec($ch);
    $curl_errno = curl_errno($ch);
    $curl_error = curl_error($ch);
    curl_close($ch);
    fclose($lfile);

    if ($curl_errno > 0) 
    {
        Log::write("CURL", "cURL Error (".$curl_errno."): ".$curl_error);
    } 
    else 
    {
        Log::write("CURL", "Data received: " . $contents);
    }

    return;

6 个答案:

答案 0 :(得分:0)

使用curl为文件提供对PHP FILE的写入权限以存储内容。这可以通过三种方式完成:

  • 如果您有终端访问权限,则使用chmod提供写入权限

  • 如果您具有CPanel访问权限,则使用目录浏览器,然后通过更改文件属性提供对文件的写入权限。

  • 您必须具有FTP访问权限并更改文件访问属性并提供写入权限。

答案 1 :(得分:0)

不要使用卷曲。

如果您只需下载图片,请转到“file_get_contents”。 这很简单:

$fileContents = file_get_contents("https://www.google.com/images/srpr/logo4w.png");
File::put('where/to/store/the/image.jpg', $fileContents);

答案 2 :(得分:0)

function saveImageToFile($image_url,$output_filename)
{
    $ch = curl_init ($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    $raw=curl_exec($ch);
    curl_close ($ch);
    if(file_exists($saveto))
    {
        unlink($saveto); //Saves over files
    }
    $fp = fopen($saveto,'x');
    fwrite($fp, $raw);
    fclose($fp);
}

答案 3 :(得分:0)

你的问题很简单,我不知道别人怎么忽略它。这是Laravel特有的。您的$ dir变量返回HTTP资源标识符。您需要的是文件系统标识符。

对于laravel,将您的URL :: to()更改为路径(“public”),告诉Laravel停止使用HTTP URI,而是将本地路径转到公用文件夹(/ your / laravel / setup / path / public /).

<强>码

$dir = path("public") . "img/products/";

$imgSrc = "an image on the web";

$file = fopen($dir . substr($imgSrc,strrpos("/",$imgSrc)+1), "wb");

$headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';              
$headers[] = 'Connection: Keep-Alive';         
$headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';         
$user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';  

$ch = curl_init($imgSrc);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);         
curl_setopt($ch, CURLOPT_HEADER, 0);         
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); 
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FILE, $file); // location to write to
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
$contents = curl_exec($ch);
$curl_errno = curl_errno($ch);
$curl_error = curl_error($ch);
curl_close($ch);

if ($curl_errno > 0) 
{
    Log::write("CURL", "cURL Error (".$curl_errno."): ".$curl_error);
} 
else 
{
    Log::write("CURL", "Data received: " . $contents);
    fwrite($file,$contents);
    fclose($file);

}

return;

答案 4 :(得分:0)

好的,最后让它全部正常工作,如果其他人试图做同样的事情,这里是代码!

我错过了这些部分:

    $dir = $_SERVER['DOCUMENT_ROOT'] . "/img/products/";

    fwrite($file,$contents);

所以这是我的最终代码......信任Sébastien指出我正确的方向。感谢。

        if($method == 'save')
        {
            $productId = Input::get('pId');
            $removeProductImages = DB::table('product_ref_images')->where('product_id', '=', $productId)->delete();

            $imagesData = Input::get('imageRefs');

            $dir = $_SERVER['DOCUMENT_ROOT'] . "/img/products/";

            $sortOrder = 0;

            for ($i=0; $i < count($imagesData); $i++) {

                $imgSrc = trim($imagesData[$i]['imgSrc']);
                $imgId = trim($imagesData[$i]['imgId']);

                $file = fopen($dir . basename($imgSrc), "wb");

                $headers[] = 'Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg';              
                $headers[] = 'Connection: Keep-Alive';         
                $headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8';         
                $user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';  

                $ch = curl_init($imgSrc);
                curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);         
                curl_setopt($ch, CURLOPT_HEADER, 0);         
                curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($ch, CURLOPT_FILE, $file);
                curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
                $contents = curl_exec($ch);
                $curl_errno = curl_errno($ch);
                $curl_error = curl_error($ch);
                curl_close($ch);

                if ($curl_errno > 0) 
                {
                    Log::write("CURL", "cURL Error (".$curl_errno."): ".$curl_error);
                    break;
                } 
                else 
                {
                    fwrite($file,$contents);
                    fclose($file);

                    $imageIds = DB::table('product_ref_images')->order_by('image_id', 'desc')->first();

                    if($imageIds == null)
                    {
                        $imageIds = 0;
                    }
                    else
                    {
                        $imageIds = $imageIds->image_id;
                    }

                    $updateImages = DB::table('product_ref_images')
                        ->insert(array(
                            'image_id'          =>  $imageIds + 1,
                            'product_id'        =>  $productId,
                            'flickr_image_id'   =>  $imgId,
                            'sort_order'        =>  $sortOrder++,
                            'local_storage_url' =>  $dir . basename($imgSrc),
                            'created_at'        =>  date("Y-m-d H:i:s"),
                            'updated_at'        =>  date("Y-m-d H:i:s")
                    ));
                }
            }
            return Response::json('Complete');
        }

答案 5 :(得分:0)

删除此行:

 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

您将响应存储到文件中,而不是存储在返回变量中。否则,您必须自己保存(就像您在其他解决方案中所做的那样)。