'fgets'에 해당되는 글 1건

 

* PHP를 통해서 원격에 있는 이미지를 긁어오거나 복사하고 싶을 때가 많은데 예외상황이 많을 것이다. 한번 예외상황들에 대해서 적어보고, 특히 php.ini를 마음대로 수정못하는 웹호스팅을 하고 있다면 꽤나 골치 아플 일이 많을 것이다.

 

: 일단 첫번째로 확인해야될 제약사항은 php.ini에서 "allow_url_fopen"이 "on" 되어있어야한다는 것이다. 만약 이것이 on 되어있다면 원격의 파일을 꽤나 쉽게 가져올 수 있다.

 

* copy 함수를 이용해서 원격 이미지 가져오기

: 우선 가장 간단하게 가져올 수 있는 방법은 copy 함수를 쓰는 것이다.

copy("http://remotedomain.com/image.jpg", "/tmp/local.jpg");

: 위와 같이 하면 바로 원격의 파일을 로컬로 복사해서 가져올 수 있다.

 

* file_get_contents, file_put_contents 함수를 이용하는 방법

: 위보다 조금은 복잡하게, 그러나 파일의 내용을 수정하고 싶거나 전체 흐름을 조율하고 싶다면 아래와 같이 할수도 있다.

$img = file_get_contents("http://remotedomain.com/image.jpg");
$save = file_put_contents("/tmp/local.jpg");

: 아니면 fwrite를 쓸수도 있다.

$img = file_get_contents("http://remotedomain.com/image.jpg");
$fp = fopen("/tmp/local.jpg", "w");
fwrite($fp, $img);
fclose($fp)
: fopen을 쓰고 싶다면 다소 복잡해지지만 가능은 하다. 물론 위의 allow_url_fopen이 설정되어있다면 가능한 것이다.
$rf = fopen($url, "r");
$fp = fopen("/tmp/local.jpg", "w");

while(!feof($rf)) {
  fwrite($fp, fread($rf, 1), 1);
}
fclose($rf);
fclose($fp);
 
: 아무튼 php.ini에서 "allow_url_fopen"이 설정되어있는 경우는 쉽게 되지만, 안되어있는 경우에는 별도로 curl을 사용해서 가져와야한다. 위의 방법들을 사용하고 싶다면 php.ini에 allow_url_fopen=on으로 설정하거나, 아파치 등 웹서버 설정에서 overwrite할 수 있다면, .htaccess에서 php_value allow_url_fopen on 등으로 설정하면 된다. (PHP 4.3.4 이상 버전 호환)
 
 
* curl을 이용하는 방법
: 웹서버의 제약이나 php의 제약으로 인하여 위의 allow_url_fopen을 설정할 수 없다면, 원격의 url에 fopen을 사용하지 못하면 직접 접속해서 가져와야할 것이다. 가장 쉽게는 curl을 사용하면 된다.
$fp = fopen("/tmp/loca.jpg", "w");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://remotedomain.com/image.jpg");
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, $fp);

curl_exec($ch);

fclose($fp);
curl_close($ch);
 

 

: 이외에서 http모듈을 사용하는 방법도 있지만, 아무리 막혀있어도 curl에서는 해결이 될 것이므로 이정도면 원격 URL의 파일을 가져오는데에는 성공할것이라 생각한다.

 

원격 URL의 파일을 로컬로 가져오기 끝.

 

출처: https://unikys.tistory.com/345 [All-round programmer:티스토리]

블로그 이미지

슬픈외로움

개발이 어려워? 모든것엔 답이있다...

,