file_get_contents создание пустого файла - PullRequest
2 голосов
/ 02 марта 2009

как я могу предотвратить создание пустым файлом file_get_contents при использовании его в качестве условия проверки в условии if?

Независимо от этого создается пустой файл, что приводит к сбою последующего вызова другого метода для getimagesize ().

Проблема в том, что, поскольку у меня настроен код, при первом его вызове будет решено сохранить изображение или отобразить ранее сохраненное изображение. Это частично зависит от наличия файла. Когда создается пустой файл, это вызывает проблемы при последующем вызове моего кода.

Самый простой способ добавить проверку, если файл существует и больше 0?

Независимо от того, работает ли мой код, file_get_contents все равно выдаст ошибку. Эта ошибка учитывается и обрабатывается (в соответствии с моим условием if), поэтому я хотел бы избежать ошибки, прерывающей вывод моего приложения, если это возможно. Есть ли способ отключить это, не скрывая фактические ошибки?

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

Ответы [ 2 ]

3 голосов
/ 02 марта 2009

Проверьте, существует ли файл, используя 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';
1 голос
/ 02 марта 2009

Это не 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 секунд), в течение которого ваш скрипт не запускается, и, следовательно, конечный пользователь не может получить обратную связь. Это следует учитывать в вашем приложении.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...