Автор Тема: Контактная форма запись файла вложения  (Прочитано 931 раз)

19 Апрель 2016, 20:08:27
  • Фрилансер
  • *
  • Сообщений: 164
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
На форме контакта есть поле для прикрепления файла.
Файл записывается в папку  upload
Но вот имя файла записывается со знаком ? в конце.
Например  5716600328f58?.jpg
Вопрос такой… Где устанавливается имя файла при записи, и как сделать имя без знака вопроса в конце.
Спасибо.
19 Апрель 2016, 21:49:32
Ответ #1
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
Имя файла меняется при загрузке в /classes/Tools.php function fileAttachment.
Знака "?" в имени быть не должно, только латинские буквы и цифры
20 Апрель 2016, 07:30:40
Ответ #2
  • Фрилансер
  • *
  • Сообщений: 164
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Спасибо за ответ. Все это так, но на локале правельно, так и есть, а на провайдере этот-же файл прикрепляю и получаю
57150cf494992?.jpg
Что делать?
20 Апрель 2016, 07:46:44
Ответ #3
  • Фрилансер
  • *
  • Сообщений: 164
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Заметил такую штуку... Если файл прикреплен имя например Узкий.jpg то записывает с ? в конце, если цифры или латынские например uzkii.jpg то запись нормальная.
20 Апрель 2016, 08:28:40
Ответ #4
  • Фрилансер
  • *
  • Сообщений: 164
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Как сделать так что-бы в строке
$fileAttachment['name'] = $_FILES[$input]['name'];в Tools.php в имени файла была замена если есть знак ? например заменить на _ или вообще убрать
Примерно как-то так
$fileAttachment['name'] = (bool)preg_match('?', $_FILES[$input]['name']);
20 Апрель 2016, 09:14:03
Ответ #5
  • Ветеран
  • *****
  • Сообщений: 3419
  • Репутация: +79/-6
  • Сообщество PrestaShop
    • Просмотр профиля
Установи на сайте кодировку UTF8 проблем не будет.
Знак '?' пояаляется когда не определен символ.
20 Апрель 2016, 09:25:56
Ответ #6
  • Фрилансер
  • *
  • Сообщений: 164
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Кодировка и так стоит UTF8 в базе
20 Апрель 2016, 09:26:54
Ответ #7
  • Ветеран
  • *****
  • Сообщений: 3419
  • Репутация: +79/-6
  • Сообщество PrestaShop
    • Просмотр профиля
20 Апрель 2016, 09:53:55
Ответ #8
  • Фрилансер
  • *
  • Сообщений: 164
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
какие файлы имеете в виду? Прикрепляю для передачи файл с диска Узкий.jpg
В базе кодировка UTF8
20 Апрель 2016, 10:50:57
Ответ #9
  • Ветеран
  • *****
  • Сообщений: 1808
  • Репутация: +49/-1
  • Сообщество PrestaShop
    • Просмотр профиля
То что такая кодировка в базе не играет никакой роли. При обрезании разрешения файла отрезается один символ от имени.
Можно изменить в fileAttachment
$file_attachment['rename'] = uniqid().Tools::strtolower(substr($_FILES[$input]['name'], -5));на
$file_attachment['rename'] = uniqid().Tools::strtolower(substr($_FILES[$input]['name'], -4));Или запретить названия файла на русском, только латиницей.
20 Апрель 2016, 11:42:43
Ответ #10
  • Фрилансер
  • *
  • Сообщений: 164
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Вы правы, заменил на
$file_attachment['rename'] = uniqid().Tools::strtolower(substr($_FILES[$input]['name'], -4));
И все, записан файл нормально.
Но это с этим именем файла
Узкий.jpg
Но может и сдругими такое быть...
Тогда такой вопрос.. Как запретить название файла на русском.. И где это сравнение поставить.
Спасибо.
 
20 Апрель 2016, 12:37:48
Ответ #11
  • Ветеран
  • *****
  • Сообщений: 16670
  • Репутация: +14630/-5
  • Сообщество PrestaShop
    • Просмотр профиля
$file_name = strstr($_FILES[$input]['name'], '.');
$file_attachment['rename'] = uniqid().Tools::strtolower($file_name);
Замените код и проблем с русскими названиями не будет.
23 Апрель 2016, 12:26:46
Ответ #12
  • Фрилансер
  • *
  • Сообщений: 164
  • Репутация: +0/-0
  • Сообщество PrestaShop
    • Просмотр профиля
Как это интересно  работает..
$file_name = strstr($_FILES[$input]['name'], '.');
$file_attachment['rename'] = uniqid().Tools::strtolower($file_name);

Если разложить то получиться пустое имя файла.
1.Возвращает подстроку строки
$_FILES[$input]['name'] начиная с первого вхождения '.' до конца строки.
2.Ворой присваивает уникальный код.
А чему присваевать если $file_name пустой FALSE.
 В принципе если бы FILES[$input]['name'] то-есть имя файла было-бы например 'USER@EXAMPLE.com' то
1.Возврат подстроки com
2.Уникальный код присвоить com

Вставлял в Tools.php не работает и файл приложения вообще не записываит.


23 Апрель 2016, 12:35:26
Ответ #13
  • Ветеран
  • *****
  • Сообщений: 1808
  • Репутация: +49/-1
  • Сообщество PrestaShop
    • Просмотр профиля
При имени файла "Узкий.jpg" должно вернуть ".jpg".
Если возвращает пустое значение (false), значит в переменной
$_FILES[$input]['name']нет знака  точки.
23 Апрель 2016, 12:41:16
Ответ #14
  • Ветеран
  • *****
  • Сообщений: 1808
  • Репутация: +49/-1
  • Сообщество PrestaShop
    • Просмотр профиля
Имя у файла должно быть не пустое
<?php
$fn 
"Узкий.jpg";
$file_name strstr($fn'.');
$file_attachment uniqid() . $file_name;
echo 
'File_attachment : ' $file_attachment;
?>