2010-04-25 125 views
1

我有一個函數將在鏈接中傳遞。鏈接是到遠程圖像。我想我可以在URL中使用該文件的擴展名來確定圖像的類型,但是一些URL在URL中不會有擴展名。他們可能只是將標題推送到瀏覽器,因此我沒有從URL解析的擴展名。下載遠程文件

如何測試URL是否具有擴展名,如果不是則讀取標題以確定文件類型?

我在這裏複雜的東西嗎?有沒有更簡單的方法來做到這一點?我正在使用Codeigniter,也許有內置的東西來做到這一點?

我真正想要做的是從URL下載 圖像與正確的 擴展。

這是我到目前爲止。

function get_image($image_link){ 

    $remoteFile = $image_link; 

    $ext = ''; //some URLs might not have an extension 

    $file = fopen($remoteFile, "r"); 


    if (!$file) { 

     return false; 

    }else{ 

     $line = ''; 

     while (!feof ($file)) { 

      $line .= fgets ($file, 4096); 

     } 

     $file_name = time().$ext; 

     file_put_contents($file_name, $line); 

    } 

    fclose($file); 

} 

感謝所有的幫助

回答

3

你永遠不想打開文件擴展名。例如,不是所有的ASCII文本文件都會有「.txt」,然後總是有趣的「.jpg」與「.jpeg」。相反,請打開Web服務器響應的Content-Type標頭。 (見http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17)。

某些網絡服務器也將遵守Accept標頭(請參閱http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1)。所以,如果你知道你只想要PNG圖像文件,那麼發送Accept: image/png。如果服務器尊重它,那麼它的響應將比通過網絡連接發送整個不需要的文件小得多。但是,因爲並非所有的Web服務器都能很好地完成這項工作(如果有的話),請確保您仍然打開Content-Type響應標頭。這只是一個帶寬節省的事情。

你也可以發送Accept: image/*得到任何類型的圖像。

乾杯。

0

你應該總是使用的Content-Type響應報頭,以確定接收到的數據的類型。從中你可以設置正確的擴展名。網址沒有擴展名,在這段時間之後,您不應該依賴任何內容。

0

您將無法使用fsock/fread甚至file_get_contents讀取標頭。這些都隱藏在背景中,並在檢索結束時丟棄。您必須使用CURL函數並使用該函數設置適當的HTTP GET會話,您可以從中檢索傳輸的全部詳細信息。