2009-03-01 65 views
2

如何防止file_get_contents在if子句中用作測試條件時創建空文件?file_get_contents創建一個空文件

無論如何創建一個空文件,這會導致以不同的方法調用getimagesize()以後失敗。

問題是,因爲我有我的代碼設置,它第一次被調用將決定保存圖像或顯示以前保存的圖像。這部分取決於文件的存在。當一個空文件被創建時,這會在隨後調用我的代碼時導致問題。

如果文件存在並且大於0,最簡單的方法是添加檢查嗎?

無論我的代碼是否工作,file_get_contents仍然會輸出一個錯誤。這個錯誤被解釋和處理(由我的條件),所以我想避免錯誤中斷我的應用程序的輸出,如果可能的話。有沒有辦法在不隱藏實際錯誤的情況下關閉此功能?

if (file_put_contents($imageDir . $pk . '.jpg', file_get_contents($pic_url))) 
{ 
     return $imageDir . $pk . '.jpg'; 
} 
else 
{ 
     return 'removed.jpg'; 
} 

回答

1

這不是file_get_contents()函數是創建一個空文件,它是file_put_contents()。

即使第二個參數爲空,file_put_contents()也會創建一個文件。因此,空文件。

您需要先檢查文件是否存在。

最簡單的解決方法是在條件內移動file_put_contents(),以便只有在有內容時才創建文件。

if (($filecontents = file_get_contents($pic_url)) !== false) 
{ 
    file_put_contents($imageDir . $pk . '.jpg', $filecontents); 
    return $imageDir . $pk . '.jpg'; 
} 
else 
{ 
    return 'removed.jpg'; 
} 

現在,這仍然給你帶來一堆問題。

  • 除非您正確驗證$ pic_url,否則您將自行開放以查找安全漏洞。如果用戶輸入本地文件的相對路徑會怎麼樣?
  • 如果無法找到文件,file_get_contents()將會發出警告。通常情況下,你可以通過首先檢查file_exists()來處理這個問題,但這在這裏是不可能的,因爲http:wrapper不支持file_exists()。因此,您可以在file_get_contents()之前使用@來抑制錯誤。在大多數情況下應該避免像這樣的錯誤。
  • 即使您使用'@'來抑制錯誤,對file_get_contents()的調用可能仍需要一些時間 - 如果地址錯誤,可能會導致服務器無法回覆,從而導致它碰到超時(可能是30秒),在此期間腳本不運行,因此最終用戶無法獲得反饋。這應該在您的應用中考慮到。
3

檢查文件是否存在使用file_exists

if (file_exists($pic_url)) { 
    $contents = file_get_contents($pic_url); 
    if (!empty($contents)) { 
     file_put_contents($imageDir . $pk . '.jpg', $contents); 
     return $imageDir . $pk . '.jpg'; 
    } 
} 
return 'removed.jpg'; 
+0

很明顯,file_exists()不被HTTP/HTTPS URL包裝器支持(依賴stat支持) - 也就是說它不會在這裏工作。 – thomasrutter 2009-03-02 01:25:08