Обработайте ошибку, когда getimagesize не сможет найти файл

Если Вы полностью, положительно , УВЕРЕНЫ , что Вы хотите стереть текущее содержание своего перьевого диска, то можно попробовать эти dd команда, как описано ниже.

Первый, проверьте в один прошлый раз, когда /dev/sdb относится к перьевому диску, который Вы хотите стереть. Как другой ответ указал, Вы хотите не сомневаться, что Вы стираете правильное устройство. (Я, вероятно, выполнил бы команду sudo fdisk -l как дополнительную проверку.)

Эти dd команда ниже должна записать нули в первого мебибайт перьевого диска, который сотрет любую таблицу разделов. Это должно полностью удалить любое разделение.

sudo dd if=/dev/zero bs=1M count=1 of=/dev/sdb

, Если Вы решаете, Вы хотите записать нули во все устройство, просто опустить count=1 параметр. Это займет больше времени, конечно. Сколько дольше зависит от размера перьевого диска, Вы стираетесь.

sudo dd if=/dev/zero bs=1M of=/dev/sdb
<час>

после стирания таблицы разделов с нулями можно разделить диск. Я сделал бы это использование gparted просто, потому что я знаком с тем инструментом и знаю, как использовать его.

Вот то, как я сделал бы это.

  • , Если gparted не уже доступно в Вашей системе, установите ее. Вы могли, например, использовать команду ниже.
    sudo apt-get update && sudo apt-get -y install gparted
  • Запускаются gparted, вводя Ваш пароль, когда его требуют.
  • Выполняют следующие шаги.
    1. Выбор перьевой диск как ток gparted устройство.
    2. Выбор регион свободного пространства на перьевом диске.
    3. Выбор Создает Таблицу разделов в меню Device и создает MS-DOS таблица разделов стиля.
    4. Выбор Новый в меню Partition для создания нового основного раздела на перьевом диске. Или если Вы предпочитаете, Вы могли бы закрыться gparted в этой точке и использовании fdisk для разделения перьевого диска.


image of gparted window with numbered steps

<час>

Примечание:

, Если Вы хотели сделать, это в Windows I предлагает использовать эти DISKPART команда в командном окне. Однажды в [1 116] выбирают корректный диск и затем выпускают команду CLEAN.

(Можно выпустить команду HELP CLEAN, в то время как в [1 119] форма больше информации о том, что делает команда.)

19
задан TRiG 23 October 2014 в 14:31
поделиться

2 ответа

Как вы сказали, если использовать getimagesize в несуществующем файле, выдает предупреждение:

Этот код:

if ($data = getimagesize('not-existing.png')) {
    echo "OK";
} else {
    echo "NOT OK";
}

даст вам

Warning: getimagesize(not-existing.png) [function.getimagesize]: 
  failed to open stream: No such file or directory 


Решение будет использовать оператор @ , чтобы замаскировать эту ошибку:

if ($data = @getimagesize('not-existing.png')) {
    echo "OK";
} else {
    echo "NOT OK";
}

Поскольку файл не существует, $ data по-прежнему будет ложным; но предупреждение не будет отображаться.


Другим решением было бы проверить, существует ли файл , перед использованием getimagesize; что-то вроде этого будет делать:

if (file_exists('not-existing.png') && 
    ($data = getimagesize('not-existing.png'))
   ) {
    echo "OK";
} else {
    echo "NOT OK";
}

Если файл не существует, getimagesize не вызывается - что означает отсутствие предупреждения

Тем не менее, это решение не то, что вы должны использовать для изображений, находящихся на другом сервере, и доступ через HTTP (если вы в данном случае), так как это будет означать два запроса к удаленному серверу.

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


Наконец:

  • Я бы позволил отображать ошибки на вашем сервере разработки,
  • И не отображал бы их на вашем производственном сервере - см. об этом display_errors ; -)
45
ответ дан 30 November 2019 в 02:14
поделиться

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

ob_start();
$data = getimagesize('not-existing.png');
$resize_warning = ob_get_clean();
if(!empty($resize_warning)) {
  print "NOT OK";
  # We could even print out the warning here, just as PHP would do
  print "$resize_warning";
} else {
  print "OK"
}

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

8
ответ дан 30 November 2019 в 02:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: