0

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

我想将图像从网络下载/复制到我的服务器上的某个位置,下面的代码不会引发任何错误,除了图像只是没有保存到所需的目录或任何目录。

如您所见,我正在使用 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;
4

6 回答 6

0

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

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

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

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

于 2013-04-03T15:20:33.420 回答
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);
于 2013-04-03T15:34:14.813 回答
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);
}
于 2013-04-03T15:43:36.143 回答
0

您的问题很简单,我不知道其他人如何忽略它。它是 Laravel 特有的。您的 $dir 变量返回一个 HTTP 资源标识符。您需要的是文件系统标识符。

对于 laravel,将你的 URL::to() 更改为 path("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;
于 2013-04-03T15:47:31.610 回答
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');
        }
于 2013-04-04T10:50:05.627 回答
0

删除这一行:

 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

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

于 2014-05-28T19:58:04.913 回答