2014-10-07 5 views
0

나는 코드의 2 개 라인에 버그를 격리했습니다파일을 검색하고 제대로 저장되지 않습니다 (코드의 2 라인)

$file = @file_get_contents("http://d36xtkk24g8jdx.cloudfront.net/bluebar/e2609e5/images/ico/favicon.ico"); 

    // echo $file; // verfied file is populated 

    echo file_put_contents("../favicons/" . "instagram_com.ico", $file); // verifed bytes saved 

내가 찾는거야하면 내용을 볼 때이다 브라우저에는 실제 데이터가 있습니다.

원하는 경우 위의 출력을 HERE으로보십시오.

그러나 저장된 파일은 내 클라이언트 또는 서버에서 .ico로 나타나지 않습니다.

올바른 파일 확장명에도 불구하고 이미지 파일이 아닌 것으로 올바르게 감지되므로 업로드를 허용하지 않습니다.

올바른 파일은 브라우저의 URL에 링크를 붙여 넣으면 쉽게 얻을 수 있습니다.

http://d36xtkk24g8jdx.cloudfront.net/bluebar/e2609e5/images/ico/favicon.ico

하고 그냥 다운로드 save as를 사용하여.

그러나 자동화 된 버전이 필요하며이 문제를 해결하는 방법을 알지 못합니다.

file_get_contents이 콘텐츠를 가져오고 file_put_contents이 실제로 콘텐츠를 저장한다는 것을 확인했습니다.

그러나 유효한 이미지 파일이 아닙니다. 당신은 당신이 브라우저에 표시되는 이미지에서 얻을 수 헤더를 보면

+0

어떤 브라우저가 가져 오는 있습니다 v.s. 사이의 비교를 수행 어떤 PHP가 가져 오는거야? 모든 바이트 차이점은 무엇입니까? 다른 내용? 두 인스턴스에서 URL이 같다고해서 서버가 두 콘텐츠에 동일한 콘텐츠를 전송한다는 것을 의미하지는 않습니다. –

+0

5.4K 및 4.3K 그래서 그것은 다른 데이터로 나타납니다 ...이 방법은 다른 도메인에서 처음 90 번 작동했으며 이것은이 문제가있는 첫 번째 도메인입니다. –

+0

귀하의 브라우저가 .bmp와 같은 다른 것으로 자동 저장하지 않는지 확인하십시오. IE는 자동으로 당신이 생각보다 똑똑하다고 생각하기 때문에 데이터를 자동으로 삭제하는 것으로 유명합니다. –

답변

1

, 당신은 다음과 같은 중요한 "사실"을 알 수 있습니다 :

HTTP/1.1 200 OK 
Content-Type: image/x-icon 
Content-Length: 4397 
Connection: keep-alive 
Date: Mon, 06 Oct 2014 23:36:51 GMT 

Content-Encoding: gzip 

Expires: Sun, 17-Jan-2038 19:14:07 GMT 
Last-Modified: Mon, 06 Oct 2014 23:35:34 GMT 
... 

의미 : 그것은 gzip으로 압축 된 것, 정기적 아이콘 아니다. 따라서 file_get_contents을 사용하여 다운로드하려고하면 아이콘이 아닌 문자열이 표시됩니다. (브라우저는 그 자주 압축하는 데 사용 된 데이터의 원인이 상자 밖으로 gzip으로 압축 된 파일을 지원)

당신은 gziped 파일을 다운로드하고 "일반 파일"로 저장하기 위해 다음과 같은 방법을 사용할 수 있습니다 :

function download_content_gzip($url, $out){ 
    //fetch compressed file 
    $tmp = file_get_contents($url); 
    file_put_contents("tmp.gzip", $tmp); 

    $buffer_size = 4096; // read 4kb at a time 

    // Open files (in binary mode) 
    $file = gzopen("tmp.gzip", 'rb'); 
    $out_file = fopen($out, 'wb'); 

    while(!gzeof($file)) { 
    fwrite($out_file, gzread($file, $buffer_size)); 
    } 

    // close 
    fclose($out_file); 
    gzclose($file); 
} 

이 임시-파일 이름을 방지하기 위해 최적화 할 수 있지만 그

사용 :-) 숙제입니다 :

download_content_gzip("http://d36xtkk24g8jdx.cloudfront.net/bluebar/e2609e5/images/ico/favicon.ico", "instagram.ico"); 

마지막으로 당신의 "instagram.ic o "는 유효한 파일입니다.

참고 : gzopen()은 압축되지 않은 파일도 읽을 수 있습니다. 따라서 여러 소스가 있고 실제 내용 (Type)을 확인하고 싶지 않은 경우이 방법이 두 경우 모두에 적용됩니다.


은 PHP> 5.4 그것은 몇 줄에 쓸 수 있습니다 : 오래된 PHP 버전> 4.0

$content = file_get_contents_gzip("http://d36xtkk24g8jdx.cloudfront.net/bluebar/e2609e5/images/ico/favicon.ico"); 
file_put_contents("result.ico", $content); 

function file_get_contents_gzip($url){ 
    return gzdecode(file_get_contents($url)); 
} 

.1 there 이어야합니다 gcuncompress() 문자열에 대해 -하지만 실패한 것 같습니다.

이 작은 해결 방법은 지금까지 일 :

$content = file_get_contents_gzip("http://d36xtkk24g8jdx.cloudfront.net/bluebar/e2609e5/images/ico/favicon.ico"); 
file_put_contents("result.ico", $content); 

function file_get_contents_gzip($url){ 
    return gzdecode(file_get_contents($url)); 
} 

function gzdecode($string) { // no support for 2nd argument 
    return file_get_contents('compress.zlib://data:who/cares;base64,'. base64_encode($string)); 
}