Fileinfo возвращает другой тип mimetype в версиях php 5.4.22 и 5.3.3.

Я пишу пользовательскую проверку файлов с помощью mimetype на моем локальном сервере. Версия php 5.4.22 и возвращает mimetype файла «docx» «application/vnd.openxmlformats-officedocument.wordprocessingml.document; charset=binary», что правильно для меня.

Но на моем сервере есть php версии 5.3.3, и он возвращает mimetype файла «docx» «application/zip; charset=binary», что неверно, и моя проверка здесь не удалась.

Пожалуйста, предложите, что мне нужно сделать, я должен обновить версию php на сервере 5.3.3 до последней версии php.

function hook_file_validate($file) {
    $errors = array();
    //Getting filename
    $extn = explode(".", $file->filename);
    //Getting file mimetype
    $finfo = new finfo(FILEINFO_MIME);
    $type = $finfo->file($file->uri);

    if ($extn[1]=='txt' && $type!='text/plain; charset=us-ascii'){
        $errors[] = t("Please upload valid file");
    } else
    if ($extn[1]=='doc' && $type!='application/msword; charset=binary'){
        $errors[] = t("Please upload valid file.");
    } else
    if ($extn[1]=='pdf' && $type!='application/pdf; charset=binary'){
        $errors[] = t("Please upload valid file.");
    } else
    if ($extn[1]=='xls' && $type!='application/octet-stream; charset=binary'){
        $errors[] = t("Please upload valid file.");
    } else
    if ($extn[1]=='docx' && $type!='application/vnd.openxmlformats-officedocument.wordprocessingml.document; charset=binary')    {
        $errors[] = t("Please upload valid file.");
    }

    return $errors;
}

person manish upadhyay    schedule 29.05.2014    source источник
comment
Файл docx на самом деле является zip-файлом, но с другим расширением. Что, вероятно, происходит, так это то, что в последних версиях php была добавлена ​​​​проверка содержимого zip   -  person Guilherme Nascimento    schedule 29.05.2014
comment
Поэтому мне нужно обновить версию php.   -  person manish upadhyay    schedule 29.05.2014
comment
Или измените код подтверждения, чтобы он был совместим с обеими версиями.   -  person Barmar    schedule 29.05.2014
comment
Прочтите комментарии пользователей: php.net/manual/pt_BR/function.finfo -file.php   -  person Guilherme Nascimento    schedule 29.05.2014
comment
возможный дубликат тип файла DOCX в PHP finfo_file is application/ заархивировать   -  person Guilherme Nascimento    schedule 29.05.2014
comment
Хорошее решение: stackoverflow.com/a/19682945/1518921   -  person Guilherme Nascimento    schedule 29.05.2014


Ответы (1)


Проверьте расширение файла после того, как получите тип mime application/zip. Вот код

$arrayZips = array("application/zip", "application/x-zip", "application/x-zip-compressed");
$arrayExtensions = array(".pptx", ".docx", ".dotx", ".xlsx");
$file = 'path/to/file.xlsx';
$original_extension = (false === $pos = strrpos($file, '.')) ? '' : substr($file, $pos);
$finfo = new finfo(FILEINFO_MIME);
$type = $finfo->file($file);
if(in_array($type, $arrayZips) && in_array($original_extension, $arrayExtensions)){
    return $original_extension;
}
person hex494D49    schedule 29.05.2014