file_get_contents, создающий пустой файл

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

Пустой файл создается независимо, что вызывает последующий вызов другого метода, чтобы 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'; } 

Это не файл_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 () выдает предупреждение, если файл не найден. Как правило, вы справляетесь с этим, сначала проверяя файл_exists (), но это НЕ МОЖЕТ здесь, потому что http: wrapper не поддерживает file_exists (). Поэтому вы можете подавить ошибку с @ перед файлом_get_contents (). В большинстве случаев следует избегать подобных ошибок.
  • Даже если вы подавите ошибку с помощью «@», вызов файла file_get_contents () может по-прежнему занимать некоторое время – если адрес неверен, это может привести к получению ответа с сервера, что приведет к его перегреву (возможно, 30 секунд), в течение которого ваш скрипт не запускается, и поэтому конечный пользователь не может получить обратную связь. Это необходимо учитывать в вашем приложении.

Проверьте, существует ли файл с помощью 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';