0

私は一日中これに対する答えを探していましたが、運がありません!

Web からサーバー上の場所に画像をダウンロード/コピーしたいのですが、以下のコードは、画像が必要なディレクトリまたは任意のディレクトリに保存されていないこと以外のエラーをスローするように縫い付けられていません。

ご覧のとおり、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 への書き込みアクセスをファイルに提供し、コンテンツを保存します。これは、次の 3 つの方法で実行できます。

  • 端末アクセス権がある場合は、chmod を使用して書き込みアクセス権を提供します

  • CPanel アクセス権がある場合は、ディレクトリ エクスプローラーを使用し、ファイル プロパティを変更してファイルへの書き込みアクセス権を付与します。

  • FTP へのアクセス権があり、ファイル アクセス属性を変更し、書き込みアクセス権を提供する必要があります。

于 2013-04-03T15:20:33.420 に答える
0

OK、ついにすべてが機能しました。他の誰かが同じようなことをしようとした場合のコードは次のとおりです。

これらの部分がありませんでした:

    $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 に答える
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 に答える