กำลังบันทึกภาพจาก URL ของ PHP


402

ฉันต้องการบันทึกภาพจาก URL ของ PHP ไปยังพีซีของฉัน สมมติว่าฉันมีหน้าhttp://example.com/image.phpหนึ่งถือรูปภาพ "ดอกไม้" หนึ่งอันไม่มีอะไรอื่นอีกแล้ว ฉันจะบันทึกรูปภาพนี้จาก URL ด้วยชื่อใหม่ (ใช้ PHP) ได้อย่างไร


1
หากคัดลอกไฟล์จำนวนมากหรือขนาดใหญ่โปรดทราบว่าวิธีการCURLนั้นดีกว่า (เช่นตัวอย่างที่ 2 ในคำตอบที่ยอมรับ ) เนื่องจากCURLใช้เวลาประมาณหนึ่งในสามของเวลาfile_put_contentsเป็นต้น
ashleedawg

คำตอบ:


712

หากคุณallow_url_fopenตั้งค่าเป็นtrue:

$url = 'http://example.com/image.php';
$img = '/my/folder/flower.gif';
file_put_contents($img, file_get_contents($url));

อื่น ๆ ใช้cURL :

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);
fclose($fp);

1
ขอบคุณครับรหัสของคุณช่วยฉันแก้ปัญหา แต่คุณได้โปรดช่วยฉันทำให้สคริปต์เป็นแบบอัตโนมัติฉันหมายถึงเมื่อรูปภาพ gif ใหม่มาถึง url (“ example.com/image.php ”) จากนั้นสคริปต์ของเราจะดึงรูปภาพใหม่และเก็บไว้ในไดเรกทอรีของฉันโดยอัตโนมัติ
riad

32
และคุณรู้ได้อย่างไรว่าภาพใหม่ "มา"?
vartec

2
ผมคิดว่าวิธีการที่ริยาจโดยใช้$_GETตัวแปรที่มี URL http://example.com/fetch-image.php?url=http://blabla.com/flower.jpgของรูปภาพ ในกรณีของตัวอย่างนี้คุณก็สามารถโทร$_GET['url']ในสคริปต์ PHP $ch = curl_init($_GET['url']);ของคุณเช่นดังนั้น:
งัด Bynens

4
+1 สำหรับการเป็นคำตอบเดียวที่ฉันเห็นซึ่งรวมถึง "b" สำหรับการตั้งค่าสถานะไบนารี
Will Morgan

34
@vartec: coz มันก็สูบบุหรี่และมีรอยยิ้มบนใบหน้าของ :)
โบ้

252
copy('http://example.com/image.php', 'local/folder/flower.jpg');

42
หรูหรามาก (ต้องใช้allow_url_fopen)
Iiridayn

ฉันไม่ได้ไปแค่เพิ่มมันดังนั้นหากผู้ใช้มาที่หน้านี้ในอนาคตพวกเขาจะเห็น :) แต่มันเป็นทางออกที่หรูหรามาก
AlexMorley-Finch

60
โปรดละเว้นความคิดเห็นของฉันฟังก์ชั่นนี้ทำงานได้อย่างสมบูรณ์แบบด้วยความโปร่งใส ฉันมีส่วนหัวเขียนรหัสอย่างยากลำบากในรูป / jpeg
AlexMorley-Finch

2
หากไม่มีโฟลเดอร์เป้าหมายมันจะสร้างขึ้นโดยอัตโนมัติหรือไม่
Monnster

3
@ มอนสเตอร์, ไม่, มันไม่ได้สำหรับระบบไฟล์ปกติ
Halil Özgür

69
$content = file_get_contents('http://example.com/image.php');
file_put_contents('/my/folder/flower.jpg', $content);

หน้ากำลังถือภาพเคลื่อนไหว gif ไฟล์ถูกเก็บไว้ในโฟลเดอร์เป็น flower.gif แต่มันว่างเปล่าไม่มีภาพที่แสดงวิธีแก้ปัญหาใด ๆ ?
riad

เปิด error_reporting (E_ALL | E_STRICT) และตรวจสอบค่าส่งคืนของ file_get_contents () จากนั้นคุณควรได้รับข้อความแสดงข้อผิดพลาดที่สมเหตุสมผล
soulmerge

บางทีผู้ดูแลไซต์อาจถูกห้ามไม่ให้อ้างอิงภายนอก ในกรณีนี้คุณสามารถลอง stream_context_create () และตั้งค่าส่วนหัว HTTP ที่เหมาะสม us2.php.net/manual/en/function.stream-context-create.php
Calvin

urlencode (' example.com/image.php' ) == 'http% 3A% 2F% 2Fexample.com% 2Fimage.php' แน่นอนว่าไม่ใช่สิ่งที่คุณต้องการ นอกจากนี้ไฟล์เป็นไบนารีต้องตั้งค่าสถานะที่เหมาะสม
vartec

4
บิตของเธรดเก่า ... แต่อย่าลืมสิทธิ์การใช้ไฟล์สำหรับไดเรกทอรีที่คุณบันทึกไว้ เพียงแค่สูญเสียสิบนาทีลืมสิ่งที่ชัดเจน
Squiggs

29

ที่นี่คุณไปตัวอย่างบันทึกภาพระยะไกลเพื่อ image.jpg

function save_image($inPath,$outPath)
{ //Download images from remote server
    $in=    fopen($inPath, "rb");
    $out=   fopen($outPath, "wb");
    while ($chunk = fread($in,8192))
    {
        fwrite($out, $chunk, 8192);
    }
    fclose($in);
    fclose($out);
}

save_image('http://www.someimagesite.com/img.jpg','image.jpg');

พวก URL มีexample.com/image.php ขอให้สังเกตว่ามันเป็นภาพที่สร้าง php ไม่ใช่ jpeg อย่างง่าย
Andrew

9
การสร้างรูปภาพหรือนามสกุลไฟล์นั้นเกี่ยวข้องกับคำถามอย่างไร
Sam152

fopen ต้องการ allow_url_fopen = 1 ด้วย
zloctb

@ SamThompson จากเอกสาร PHPมันหมายถึงขนาดอัน (ปกติ 8192)
Daan

AFAIK fread อาจส่งคืนก้อนที่สั้นกว่าที่ร้องขอ 8K คุณไม่จำเป็นต้องคำนวณความยาวอันมีประสิทธิภาพของ fwrite ใช่ไหม
Sergey

25

คำตอบของ VartecกับcURLไม่ได้ผลสำหรับฉัน มันทำได้โดยมีการปรับปรุงเล็กน้อยเนื่องจากปัญหาเฉพาะของฉัน

เช่น,

เมื่อมีการเปลี่ยนเส้นทางบนเซิร์ฟเวอร์ (เช่นเมื่อคุณพยายามบันทึกภาพโปรไฟล์ Facebook) คุณจะต้องตั้งค่าตัวเลือกต่อไปนี้:

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

โซลูชันที่สมบูรณ์จะกลายเป็น:

$ch = curl_init('http://example.com/image.php');
$fp = fopen('/my/folder/flower.gif', 'wb');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);

1
ขอบคุณ zuul & stoe พบว่ามีประโยชน์จริง ๆ หลังจากค้นหามากขึ้นหรือใช้เวลา
Rakesh Sharma

ยอดเยี่ยม - นั่นช่วยได้มาก! ควรระบุไว้ในคำตอบของ Vartec ด้วย
Nick

10

ฉันไม่สามารถหาวิธีแก้ไขปัญหาอื่นได้ แต่ฉันสามารถใช้ wget:

$tempDir = '/download/file/here';
$finalDir = '/keep/file/here';
$imageUrl = 'http://www.example.com/image.jpg';

exec("cd $tempDir && wget --quiet $imageUrl");

if (!file_exists("$tempDir/image.jpg")) {
    throw new Exception('Failed while trying to download image');
}

if (rename("$tempDir/image.jpg", "$finalDir/new-image-name.jpg") === false) {
    throw new Exception('Failed while trying to move image file from temp dir to final dir');
}

วิธีนี้ก็เป็นวิธีเดียวที่ใช้ได้ผลสำหรับฉัน ขอบคุณแอนดรู!
sentinel777


3
$img_file='http://www.somedomain.com/someimage.jpg'

$img_file=file_get_contents($img_file);

$file_loc=$_SERVER['DOCUMENT_ROOT'].'/some_dir/test.jpg';

$file_handler=fopen($file_loc,'w');

if(fwrite($file_handler,$img_file)==false){
    echo 'error';
}

fclose($file_handler);

1

สร้างโฟลเดอร์ชื่ออิมเมจที่อยู่ในพา ธ ที่คุณวางแผนที่จะวางสคริปต์ php ที่คุณกำลังจะสร้าง ตรวจสอบให้แน่ใจว่ามีสิทธิ์ในการเขียนสำหรับทุกคนมิฉะนั้นสคริปต์จะไม่ทำงาน (จะไม่สามารถอัปโหลดไฟล์ไปยังไดเรกทอรี)



0

ติดตั้ง wkhtmltoimage บนเซิร์ฟเวอร์ของคุณจากนั้นใช้แพ็คเกจแพ็คเกจของฉัน packagist.org/packages/tohidhabiby/htmltoimage เพื่อสร้างภาพจาก url ของเป้าหมายของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.