HTTP를 통해 원격 서버에서 이미지 복사


81

PHP를 사용하여 원격 서버에서 로컬 폴더로 이미지를 가져 오거나 복사하는 간단한 방법을 찾고 있습니다. 서버에 대한 FTP 액세스 권한이 없지만 모든 원격 이미지는 HTTP (예 : http://www.mydomain.com/myimage.jpg ) 를 통해 액세스 할 수 있습니다 .

사용 예 : 사용자가 자신의 프로필에 이미지를 추가하려고합니다. 이미지가 이미 웹에 있으며 사용자가 직접 URL을 제공합니다. 이미지를 핫 링크하지 않고 내 도메인에서 가져 와서 제공하고 싶습니다.


서버에이를위한 프록시 모듈이 없습니까?
jiggunjer

답변:


153

서버에서 PHP5와 HTTP 스트림 래퍼를 활성화 한 경우 로컬 파일에 복사하는 것은 매우 간단합니다.

copy('http://somedomain.com/file.jpeg', '/tmp/file.jpeg');

이것은 필요한 모든 파이프 라이닝 등을 처리합니다. 일부 HTTP 매개 변수를 제공해야하는 경우 제공 할 수있는 세 번째 '스트림 컨텍스트'매개 변수가 있습니다.


33
allow_url_fopen은 php.ini에서 = on이어야합니다.
mauro.dec

3
allow_url_fopen 주석은 한 시간 동안 머리를 긁적입니다. 감사합니다, @ mauro.dec!
Michael Stalker

2
이와 같은 URL로 무엇을 기부하고 있습니까 http://desmond.imageshack.us/Himg100/scaled.php?server=100&filename=desertoh.jpg&res=crop ?
Yuseferi

이 답변에 감사드립니다-거의 다 왔어요! 당신이 '/tmp/file.jpg'라고 말할 때-그것은 무엇과 관련이 있습니까? 웹 서버의 루트 ... (예 : / var / www / vhosts 등) 또는 웹 사이트의 루트 : / httpdocs / ... ?? 파일이 나타나는 것을 볼 수 없으며 url-fopen을 ON으로 설정했습니다. !!
itsricky

1
https를 사용하지 마십시오, 단지 HTTP
edCoder

31

사용하다

$imageString = file_get_contents("http://example.com/image.jpg");
$save = file_put_contents('Image/saveto/image.jpg',$imageString);

감사합니다 !! 두 번째 솔루션이 작동합니다 .. 모든 솔루션의 상단이 나를 위해 작동하지 않습니다. : p
Rajnish

4
작은 파일에 대한 좋은 팁, 그러나 큰 파일의 경우 PHP 메모리가 폭발 할 것입니다 :(
Radon8472

10

PHP에는 파일의 내용을 문자열로 읽는 내장 함수 file_get_contents ()가 있습니다.

<?php
//Get the file
$content = file_get_contents("http://example.com/image.jpg");

//Store in the filesystem. $fp = fopen("/location/to/save/image.jpg", "w"); fwrite($fp, $content); fclose($fp); ?>

파일을 데이터베이스에 저장하려면 $ content 변수를 사용하고 파일을 디스크에 저장하지 마십시오.


2
일부 서버들 원인 좋은 방법을 '컬을한다 사용하는 것은 보안상의 이유로 file_get_contents를 지원하지
Rinto 조지

1
작은 파일에 대한 좋은 팁, 그러나 큰 파일의 경우 PHP 메모리가 폭발 할 것입니다. :( curl은 표준 PHP의 일부가 아니기 때문에 좋은 선택이 아닙니다
Radon8472

7

다음 네 가지 가능성이 있습니다.

  • 원격 파일 . allow_url_fopenphp.ini에서 활성화 해야 하지만 가장 쉬운 방법입니다.

  • 또는 PHP 설치에서 지원하는 경우 cURL을 사용할 수 있습니다 . 더있다 .

  • 정말 수동으로하고 싶다면 HTTP 모듈을 사용하세요 .

  • 소켓을 직접 사용 하지 마십시오 .


왜 "소켓을 직접 사용하려고하지 마십시오."? (내가 사용하는 것은 gist.github.com/0893a7ec908ff508aac6 )
Gajus

@Gajus : 해당 스 니펫에서 직접 소켓을 사용하지 않습니다. 원격 파일을 열기 위해 php의 기능을 사용하고 있습니다.
Georg Schölly 2011

4

가장 기본적인 방법은 다음과 같습니다.

$url = "http://other-site/image.png";
$dir = "/my/local/dir/";

$rfile = fopen($url, "r");
$lfile = fopen($dir . basename($url), "w");

while(!feof($url)) fwrite($lfile, fread($rfile, 1), 1);

fclose($rfile);
fclose($lfile);

그러나이 작업을 많이 수행하거나 호스트가 원격 시스템에 대한 파일 액세스를 차단하는 경우 CURL을 사용하는 것이 좋습니다. CURL은 더 효율적이고 약간 더 빠르며 더 많은 공유 호스트에서 사용할 수 있습니다.

봇이 아닌 데스크톱처럼 보이도록 사용자 에이전트를 스푸핑 할 수도 있습니다!

$url = "http://other-site/image.png";
$dir = "/my/local/dir/";
$lfile = fopen($dir . basename($url), "w");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)');
curl_setopt($ch, CURLOPT_FILE, $lfile);

fclose($lfile);
curl_close($ch);

두 경우 모두 GD를 통해 전달하여 실제로 이미지인지 확인할 수 있습니다.


1
GD로 이미지를 확인하려면 파일을 저장 한 후 바로 다음을 실행 하는 것이 좋습니다 . psoug.org/snippet/Check_if_an_image_exists_GD_364.htm-false로 돌아 오면 파일을 즉시 삭제합니다.
Oli

4
curl_exec($ch)이전 curl_close($ch)에 놓쳤 fclose($ch)으며 이전이 아닌 끝에 배치해야합니다. curl_close($ch)즉, 파일에 아무것도 쓰지 않기 전에 파일을 닫아야하므로 빈 파일 만 얻게됩니다.
Hendra Uzia 2010

2

file_get_contents를 사용하는 것은 매우 간단 합니다. 첫 번째 매개 변수로 URL을 제공하십시오.


1
이것은 보안상의 이유로 많은 공유 호스트의 로컬 파일 시스템에 잠겨 있습니다. cURL은 더 좋고 빠르며 더 강력합니다. 일반적으로 원격 파일 시스템에서 fopen을 차단하는 호스트에서 사용할 수 있습니다.
Oli

cURL을 사용할 수 있다면 더 좋을 것입니다. <a href=" se2.php.net/curl"> php.net의
cUrl

2

폴더를 만들고 적의 이름을 지정하십시오. 예제를 열고 메모장을 열고이 코드를 삽입하십시오.

http://www.google.com/aa.zip 을 파일로 변경 하고 예를 들어 m.php에 저장하십시오.

php 파일을 666으로 chamod하고 폴더를 777로 다운로드합니다.

<?php
define('BUFSIZ', 4095);
$url = 'http://www.google.com/aa.zip';
$rfile = fopen($url, 'r');
$lfile = fopen(basename($url), 'w');
while(!feof($rfile))
fwrite($lfile, fread($rfile, BUFSIZ), BUFSIZ);
fclose($rfile);
fclose($lfile);
?>

마지막으로 브라우저에서 다음 URL http://www.example.com/download/m.php를 입력 하십시오.

다른 서버에서 다운로드 한 파일이 다운로드 폴더에 표시됩니다.

감사


0

GET 요청을 사용하여 이미지를 다운로드하고 서버의 웹 액세스 가능 디렉토리에 저장합니다.

PHP를 사용 curl하면서 다른 서버에서 파일을 다운로드 하는 데 사용할 수 있습니다 .


0

질문에 'php'태그를 지정 했으므로 서버에서 실행중인 PHP를 가정하겠습니다. 가장 좋은 방법은 자신의 웹 서버를 제어하고 cURL을 php로 컴파일하는 것입니다. 이렇게하면 웹 서버가 다른 웹 서버에 요청할 수 있습니다. 이것은 보안 관점에서 매우 위험 할 수 있으므로 대부분의 기본 웹 호스팅 공급자는이 옵션을 활성화하지 않습니다.

다음은 cURL 사용에 대한 PHP 매뉴얼 페이지입니다 . 댓글에서 다운로드 및 이미지 파일 예를 찾을 수 있습니다.

libcurl을 사용하지 않으려면 fsockopen을 사용하여 코드를 작성할 수 있습니다. 이것은 php에 내장되어 있으며 (호스트에서는 비활성화 될 수 있음) 소켓을 직접 읽고 쓸 수 있습니다. fsockopen 매뉴얼 페이지의 예제를 참조 하십시오 .


0

원래 파일 이름과 확장자를 보존해야하는 사람들을 위해

$origin = 'http://example.com/image.jpg';

$filename = pathinfo($origin, PATHINFO_FILENAME);
$ext = pathinfo($origin, PATHINFO_EXTENSION);

$dest = 'myfolder/' . $filename . '.' . $ext;

copy($origin, $dest);

-5

이 답변 은 서버에서 클라이언트 측으로 이미지를 다운로드하는 데 도움 되었습니다.

<a download="original_file.jpg" href="file/path.jpg">
  <img src="file/path.jpg" class="img-responsive" width="600" />
</a>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.