Как проверить, полностью ли загружено изображение или нет в PHP

Вот сценарий. У меня есть два запроса: один для загрузки изображения, а другой для обработки загруженного изображения. Выполнение проверки file_exists() позволяет мне узнать, существует ли файл или нет. Но проблема возникает, когда я нажимаю второй запрос (для обработки изображения) еще до того, как файл будет полностью загружен. Поправьте меня, если я ошибаюсь, file_exists() возвращает true, потому что даже при загрузке одного байта файл создается, даже если данные изображения загружены не полностью, и это создает проблемы при дальнейшей обработке. изображение.

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

Я хотел бы знать, можно ли выполнить эту проверку только на PHP?

Я пробовал использовать PHP Imagick, например

try {
    $imageMagickCheck = new Imagick($filename);
} catch (Exception $exc) {
    $error = $exc->getMessage();
    file_put_contents("/tmp/corruption.log", $error."\n",FILE_APPEND);
    $imageMagickCheck = FALSE;
}

Приведенный выше код дает исключение, если я вручную удаляю двоичные данные изображения через. текстовый редактор, а затем вставьте этот файл в код. Итак, я подумал, что он должен распознавать, полностью ли загружено изображение или нет. Но я не видел никаких исключений в этом. Я не уверен, почему. Я где-то читал, что мы можем сделать что-то подобное с createimagefromjpg().

Был бы очень признателен, если бы кто-то хороший дал мне четкое представление об этом.

Процедура загрузки изображения

Загрузка изображения происходит в два этапа. По сути, сервер обработки изображений представляет собой сервер Lua-Openresty, и у нас есть оболочка для него, написанная на PHP. Клиент загружает изображение как загрузку составной формы, которую я получаю в массиве $_FILES в оболочке PHP. Затем я загружаю этот файл на сервер Lua, используя cURL. Lua снова сохраняет этот файл в соответствующем каталоге. И PHP Wrapper, и сервер openresty используют одну и ту же файловую систему. Имеет смысл не отправлять файл на lua, а сохранять файл через сам PHP(что я и планирую сделать), но и тогда проблема остается.


person Parthapratim Neog    schedule 14.10.2016    source источник
comment
Как вы загружаете файл?   -  person Bart Friederichs    schedule 14.10.2016
comment
Обычно при загрузке также указывается размер загруженного файла. Вы можете проверить размер файла для дополнительной проверки.   -  person Bart Friederichs    schedule 14.10.2016
comment
@BartFriederichs Теперь, когда вы упомянули, я должен включить это в вопрос. Есть две фазы загрузки, первая — это загрузка базовой многокомпонентной формы, которую я получаю в массиве $_FILES. Следующий этап — загрузка файла на сервер Lua с использованием PHP Curl. Я включу это подробно в вопрос.   -  person Parthapratim Neog    schedule 14.10.2016
comment
@BartFriederichs Пожалуйста, проверьте мое обновление.   -  person Parthapratim Neog    schedule 14.10.2016
comment
@ParthapratimNeog, почему ты делаешь это в два этапа? Вы можете использовать библиотеку PHP curl для публикации изображения на вашем сервере Lua. Просто нужно добавить код завитка в конце функции загрузки.   -  person vishwakarma09    schedule 14.10.2016
comment
@ vishwakarma09 Это потому, что я не хочу раскрывать URL-адрес сервера обработки изображений, который будут использовать клиенты. Для этого я использую PHP-оболочку (наш API), которая выступает в качестве промежуточного программного обеспечения для выполнения других проверок (включая проверку того, загружен ли файл полностью или нет) перед передачей обработки процессору изображений.   -  person Parthapratim Neog    schedule 14.10.2016
comment
@ParthapratimNeog Ни в коем случае это не будет показано клиентам. Это написано на стороне сервера PHP. Предположим, ваша загрузка пойдет на функцию загрузки. В этой функции после того, как вы закончите перемещение/переименование файла/и т.д. вы просто запускаете код curl (ваша оболочка PHP)   -  person vishwakarma09    schedule 14.10.2016
comment
@vishwakarma09 Вот что происходит. Пожалуйста, прочитайте вопрос еще раз. чтобы свернуть его с PHP, вы должны сначала загрузить файл на PHP, верно? Это делает его двухэтапным. Я не очень понимаю, что вы пытаетесь сказать и как это поможет проверить, загружен ли файл на 100% или нет.   -  person Parthapratim Neog    schedule 14.10.2016


Ответы (2)


В таком случае вы можете попробовать этот

 public function checkcompletefileuploaded($url = '') {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    // don’t download content
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    if (curl_exec($ch) !== FALSE) {
      return true;
    } else {
      return false;
    }
  }

  $result = checkcompletefileuploaded($imagefullpath);

  if($result){
    echo "File upoloaded succesfully";
  }else{
    echo "File not uploaded";
  }

Примечание. $imagefullpath: путь к недавно загруженному файлу (путь к папке назначения).

person Test1    schedule 14.10.2016

person    schedule
comment
is_uploaded_file() Возвращает TRUE, если файл с именем filename был загружен через HTTP POST. Это не поможет проверить, загружен ли загруженный файл на 100% или нет. - person Parthapratim Neog; 14.10.2016