PrestaShop: позволяет клиентам загружать файлы PDF, AI и EPS для настройки продукта.Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 PrestaShop: позволяет клиентам загружать файлы PDF, AI и EPS для настройки продукта.

Сообщение Anonymous »


Я использую Prestashop 1.6.1.7 и у меня есть следующий метод imageUpload(), который позволяет пользователям загружать файлы по своему выбору. По умолчанию Prestashop разрешает загрузку только файлов GIF, JPG, JPEG или PNG.

Я пытаюсь предоставить пользователям возможность загружать еще несколько типов (в частности, PDF, AI и EPS)

Вот метод PictureUpload() в переопределении ProductController:

защищенная функция imageUpload() { if (!$field_ids = $this->product->getCustomizationFieldIds()) { вернуть ложь; } $authorized_file_fields = массив(); foreach ($field_ids как $field_id) { if ($field_id['type'] == Product::CUSTOMIZE_FILE) { $authorized_file_fields[(int)$field_id['id_customization_field']] = 'file'.(int)$field_id['id_customization_field']; } } $indexes = array_flip($authorized_file_fields); foreach ($_FILES as $field_name => $file) { if (in_array($field_name, $authorized_file_fields) && isset($file['tmp_name']) && !empty($file['tmp_name'])) { //$file_name = md5(uniqid(rand(), true)); $file_name = $file['name']; // В этом if ($error = ImageManager::validateUpload($file, (int)Configuration::get('PS_PRODUCT_PICTURE_MAX_SIZE'))) { $this->errors[] = $error; } $product_picture_width = (int)Configuration::get('PS_PRODUCT_PICTURE_WIDTH'); $product_picture_height = (int)Configuration::get('PS_PRODUCT_PICTURE_HEIGHT'); $tmp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS'); if ($error || (!$tmp_name || !move_uploaded_file($file['tmp_name'], $tmp_name))) { вернуть ложь; } /* Исходный файл */ if (!ImageManager::resize($tmp_name, _PS_UPLOAD_DIR_.$file_name)) { $this->errors[] = Tools::displayError('Во время загрузки изображения произошла ошибка.'); } /* Меньший */ elseif (!ImageManager::resize($tmp_name, _PS_UPLOAD_DIR_.$file_name.'_small', $product_picture_width, $product_picture_height)) { $this->errors[] = Tools::displayError('Во время загрузки изображения произошла ошибка.'); } elseif (!chmod(_PS_UPLOAD_DIR_.$file_name, 0777) || !chmod(_PS_UPLOAD_DIR_.$file_name.'_small', 0777)) { $this->errors[] = Tools::displayError('Во время загрузки изображения произошла ошибка.'); } еще { $this->context->cart->addPictureToProduct($this->product->id, $indexes[$field_name], Product::CUSTOMIZE_FILE, $file_name); } отсоединить ($tmp_name); } } вернуть истину; } Это относится к классу ImageManager, который имеет этот метод (я обновил сообщение об ошибке):

публичная статическая функция validateUpload($file, $max_file_size = 0, $types = null) { if ((int)$max_file_size > 0 && $file['size'] > (int)$max_file_size) { return sprintf(Tools::displayError('Изображение слишком большое (%1$d КБ). Максимально допустимое: %2$d КБ'), $file['size']/1024, $max_file_size/1024); } if (!ImageManager::isRealImage($file['tmp_name'], $file['type']) || !ImageManager::isCorrectImageFileExt($file['name'], $types) || preg_match('/\ %00/', $file['имя'])) { return Tools::displayError('Формат изображения не распознан, разрешенные форматы: .gif, .jpg, .png, .pdf, .ai, .eps'); //Я обновил это — эта ошибка возникает, когда я пытаюсь загрузить AI } если ($file['ошибка']) { return sprintf(Tools::displayError('Ошибка при загрузке изображения; измените настройки вашего сервера. (Код ошибки: %s)'), $file['error']); } вернуть ложь; } Место, где этот метод дает сбой, указывает на два дополнительных метода, опубликованных ниже. Я обновил метод isRealImage, чтобы попытаться разрешить нужные мне типы, но он по-прежнему терпит неудачу (и я прокомментировал, где это не удалось).

публичная статическая функция isRealImage($filename, $file_mime_type = null, $mime_type_list = null) { // Обнаружение типа контента mime $ mime_type = ложь; если (!$mime_type_list) { //Я ОБНОВИЛ ЭТОТ СПИСОК, ЧТОБЫ РАЗРЕШИТЬ ДРУГИЕ ТИПЫ ФАЙЛОВ $mime_type_list = array('image/gif', 'image/jpg', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png', 'application/illustrator', ' application/ai', 'application/eps', 'application/x-eps', 'image/eps', 'image/x-eps', 'application/pdf', 'application/acrobat', 'application/x- pdf», «текст/pdf», «текст/x-pdf»); } // Попробуйте 4 разных метода, чтобы определить тип mime если (function_exists('getimagesize')) { $image_info = @getimagesize($filename); // ЗДЕСЬ IMAGE_INFO ПОКАЗЫВАЕТСЯ КАК «ЛОЖЬ», ПОЭТОМУ ПРИ ЗАГРУЗКЕ ФАЙЛА .AI ДАЛЬШЕ НЕ ПРОЙДЕТ если ($image_info) { $mime_type = $image_info['mime']; } еще { $file_mime_type = ложь; } } elseif (function_exists('finfo_open')) { $const = определено('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE: FILEINFO_MIME; $finfo = finfo_open($const); $mime_type = finfo_file($finfo, $filename); finfo_close($finfo); } elseif (function_exists('mime_content_type')) { $mime_type = mime_content_type($filename); } elseif (function_exists('exec')) { $mime_type = Trim(exec('file -b --mime-type '.escapeshellarg($filename))); если (!$mime_type) { $mime_type = Trim(exec('file --mime '.escapeshellarg($filename))); } если (!$mime_type) { $mime_type = Trim(exec('file -bi '.escapeshellarg($filename))); } } if ($file_mime_type && (empty($mime_type) || $mime_type == 'обычный файл' || $mime_type == 'text/plain')) { $mime_type = $file_mime_type; } // Для каждого разрешенного типа MIME мы ищем его внутри текущего типа MIME foreach ($mime_type_list как $type) { если (strstr($mime_type, $type)) { вернуть истину; } } вернуть ложь; } Я также обновил метод isCorrectImageFileExt:

публичная статическая функция isCorrectImageFileExt($filename, $authorized_extensions = null) { // Фильтр по расширению файла если ($authorized_extensions === ноль) { //ДОБАВЛЕНЫ РАЗРЕШЕННЫЕ ТИПЫ, КОТОРЫЕ Я ХОЧУ $authorized_extensions = array('gif', 'jpg', 'jpeg', 'jpe', 'png', 'pdf', 'ai', 'eps'); } $name_explode = взорваться('.', $filename); если (count($name_explode) >= 2) { $current_extension = strtolower($name_explode[count($name_explode) - 1]); if (!in_array($current_extension, $authorized_extensions)) { вернуть ложь; } } еще { вернуть ложь; } вернуть истину; } Что думаете по этому поводу?

Помощь в этом?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»