PHP URL에서 이미지 저장


402

PHP URL에서 PC로 이미지를 저장해야합니다. http://example.com/image.php단일 "꽃"이미지 가있는 페이지가 있다고 가정 해 보겠습니다 . 새로운 이름으로 PHP에서이 이미지를 어떻게 저장합니까?


1
대량의 파일 또는 크기의 파일을 복사하는 경우 CURL 방법 (예 : 허용 된 답변 의 두 번째 예와 같이 )이 CURL 시간의 1/3 정도 소요 file_put_contents
되므로 선호

답변:


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
고마워 친구, 당신의 코드는 문제를 해결하는 데 도움이됩니다. 그러나 u pls는 스크립트를 자동화하는 데 도움이 될 수 있습니다. 새로운 gif 이미지가 URL에 올 때 (“ example.com/image.php ”) 스크립트가 자동으로 새 이미지를 가져 와서 내 디렉토리에 저장합니까?
riad

32
그리고 새로운 이미지가 "온다"는 것을 어떻게 알 수 있습니까?
vartec

2
riad $_GET는 이미지의 URL을 포함 하는 변수를 사용하는 것을 의미한다고 생각 합니다 http://example.com/fetch-image.php?url=http://blabla.com/flower.jpg. 이 예제의 경우 다음 $_GET['url']과 같이 PHP 스크립트를 호출하면 $ch = curl_init($_GET['url']);됩니다.
Mathias Bynens

4
이진 플래그에 대한 "b"를 포함하는 유일한 대답은 +1입니다.
Will Morgan

34
@vartec : coz 그것은 담배를 피우고 있었고 얼굴에 큰 웃음을 가지고 있었다 :)
Jimbo

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

42
매우 우아합니다 (필요 allow_url_fopen).
Iiridayn


60
내 의견을 무시하십시오.이 기능은 투명성과 완벽하게 작동합니다. 헤더를 image / jpeg로 하드 코딩했습니다.
AlexMorley-Finch

2
대상 폴더가 없으면 자동으로 생성됩니까?
Monnster

3
@Monnster, 아닙니다. 일반적인 파일 시스템에는 적합하지 않습니다.
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 2009

사이트 관리자가 외부 추천을 금지했을 수 있습니다. 이 경우 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
오래된 스레드 비트 ...하지만 저장중인 디렉토리에 대한 파일 권한을 잊지 마십시오. 명백한 것을 잊어 버린 10 분을 낭비했습니다.
qu 스.

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 입니다. 단순한 jpeg가 아닌 PHP로 생성 된 이미지입니다.
Andrew

9
이미지 또는 파일 확장자의 생성은 질문과 어떤 관련이 있습니까?
Sam152

fopen에는 allow_url_fopen = 1도 필요
zloctb

PHP 문서의 @SamThompson은 청크 크기 (일반적으로 8192)를 의미합니다.
Daan

AFAIK 스프레드는 요청 된 8K보다 짧은 청크를 반환 할 수 있습니다. fwrite의 유효 청크 길이를 계산할 필요가 없습니까?
Sergey

25

cURL에 대한 Vartec의 답변 이 효과 가 없었습니다. 내 특정 문제로 인해 약간 개선되었습니다.

예를 들어

서버에 리디렉션이있는 경우 (예 : 페이스 북 프로필 이미지를 저장하려는 경우) 다음 옵션 세트가 필요합니다.

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 정말 더 많은 검색 또는 지출 시간 이후에 도움이되었다고합니다
라 케쉬 샤르마에게

화려한-그것은 많은 도움이되었습니다! Vartecs의 답변에도 주목해야합니다
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

4

file()PHP 매뉴얼을 참조하십시오 :

$url    = 'http://mixednews.ru/wp-content/uploads/2011/10/0ed9320413f3ba172471860e77b15587.jpg';
$img    = 'miki.png';
$file   = file($url);
$result = file_put_contents($img, $file)

2
allow_url_fopen = 켜짐
zloctb

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 스크립트를 배치 할 경로에 images라는 이름의 폴더를 만듭니다. 모든 사람에게 쓰기 권한이 있는지 확인하십시오. 그렇지 않으면 스크립트가 작동하지 않습니다 (파일을 디렉토리에 업로드 할 수 없음).


0
$data = file_get_contents('http://example.com/image.php');
$img = imagecreatefromstring($data);
imagepng($img, 'test.png');

0

서버에 wkhtmltoimage를 설치 한 다음 packagist.org/packages/tohidhabiby/htmltoimage 패키지를 사용하여 대상 URL에서 이미지를 생성하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.