Pull to refresh

Comments 31

Может быть глупый вопрос задам, но зачем yii обрезает расширение?
В подробности не вдавался, но судя по всему имя файла разбивается по точкам в массив, а при сохранении вероятно собирается из двух первых элементов — в результате получаем следующее: взяли test.php переименовали в test.php.jpg, он залился и на сервере обозвался test.php.
Поправьте если не прав, но насколько помню расширение(последний элемент массива) отсекается вообще.
В случае с несколькими точками да. Если же файл нормальный, то почему отсекается?
Нет, это я понял. Я не очень понимаю для чего yii вообще это делает. То есть если заливают файл 123.jpg, то да, он сохранится как 123, но вопрос в том почему бы его не хранить как 123.jpg?
Сам недавно разбирался в yii-based системе и не понял для чего нужны эти выкрутасы. По крайней мере с картинками.
Yii сам ничего не делает, jquery.multifile.js лишь «управляет» инпутами, а CUploadedFile сохрает под нужным именем, как надо сохранять чтобы обрезалось имя?
В моём случае, просто была страничка редактирования профиля юзера. При загрузке аватарки, система сохраняла файл без расширения, а в базу писала в два столбца расширение и имя файла.
Какой-то непонятный костыль, это получается что файл 14.11.2011.jpg будет считаться неверным типом?
Да и править нужно не javascript, а php библиотеку.
Считаете 14.11.2011.jpg — это нормальное имя файла? А javascript правил потому что в данном случае эти проверки происходят именно там и логично было бы там и поправить.
А чем оно ненормально? От этого фотография перестанет быть фотографией?
Ваша проверка обходится за одну секунду.
Ну над пхп проверкой уже работаем — будем дописывать пхп проверку в любом случае, потому как при выключенном в браузере яваскрипте вообще заливается все что пожелаешь.
Вы yii скачивали с официального сайта? Посмотрите, как называется файл ;)

yii-1.1.9.r3527.tar.gz или вы качали yii-1.1.9.r3527.zip?
ну я так понимаю что проблема не решена, вы только запретили загрузку двойного расширения на стороне клиента (javascript), а проблема думаю так и осталась и есть возможность загрузить файл на «прямую» обратившись к скрипту.
возможно ошибаюсь, не работал с данным фреймворком
написал коммент чуть ниже
т.е складывать фаил в папку где нельзя вообще выполнять скрипты не вариант?
у нас по-моему права на эту папку 755 поэтому не вариант
Можно (нужно) же отключить выполнение скриптов в этой директории.
Хочу ответить сразу всем кто пишет решена ли проблема или не решена, можно ли обойти защиту или нельзя. Проверку на уровне пхп мы сделаем — как мы ее сделаем к данной статье отношения не имеет, а имеет отношения к нашему конкретному случаю (приложению). Темой топика изначально является баг в виджете CMultiFileUpload, который генерирует поле для аплоада на сервер нескольких файлов одновременно. Смотрим доку и видим что CMultiFileUpload работает на базе jQuery Multi File Upload plugin. Мы нашли ошибку именно в js коде, предложили решение как ее там же в js коде исправить. В чем проблема?
Почему вы решили, что ошибка в js коде? Ваше решение не исправляет, а добавляет ошибку — теперь нельзя будет загрузить файлы с более чем одной точкой в имени.
Потому что читайте внимательно комментарии выше, ваш файл с несколькими точками в любом случае зальется с искажением названия и с другим расширением в результате, но все таки зальется. Данное же решение позволяет правильно работать свойству виджета accept.
Читаю комментарии выше. Нигде не вижу исправления ошибки искажения названия. Вижу только то, что вижу — вами добавлен новый баг.

Ну или как по вашему должно правильно работать свойство accept при имени файла содержащем более чем одну точку?
Берем файл test.php.jpg который является пхп скриптом с измененным именем файла и закачиваем его на сервер. accept пропускает его, но в результате на сервере лежит файл под названием test.php. По-вашему это нормально и можно так и оставить, но зато будет возможность закачать файл 14.11.2011.jpg, который опять же после закачки станет файлом 14.11, получается так?
А если выяснится, что при загрузке файлов содержащих символ «а» данное расширение удаляет index.php — запретите загрузку файлов с этим символом?
Зачем вообще обрезать расширение? Да и вообще хранить файл с оригинальным именем, коллизии названий, проблемы с кириллицей…
Ну в том то все и дело, расширение изначально обрезалось в оригинальном js скрипте если несколько точек в имени файла. Я решил это таким способом — соответственно ничего не обрезается, а появляется ошибка Invalid file type.
script.min.js или archive.tar.gz искаженное?
Нет, расширением является по, что идет после последней точки и это довольно частая ошибка, не раз видел код:
$a = explode($basename);
$filename = $a[0];
$ext = $[1];

В случае с картинками точка в имени действительно редкое явление, но это не значит, что ее не может быть.

В данном случае ошибка в серверной части, причем, похоже это только ваша ошибка, jQuery Multiple File Upload никак не искажает название файла.
Ну как бы все это происходит в нашем случае вот в этом файле jquery.multifile.js
Тогда такой вопрос — причём здесь Yii?
Да и, насколько я помню, доки по multifile настоятельно рекомендуют делать серверную проверку расширений.
В jquery.multifile.js вообще нет кода отвечающего за отправку файла, единственное что он делает скрывает выбранный инпут:
// Hide this element (NB: display:none is evil!)
$(this).css({ position:'absolute', top: '-3000px' });


подменяя его на div.MultiFile-label с полным именем файла, выбрав «test.php.jpg» — видно «test.php.jpg», на сервер будет отправляться обычная форма с множественными файлами, соответственно на сервер будут передано настоящее имя файла, в чем легко убедиться сделав «var_dump($_FILES); die();», где опять же видим «test.php.jpg».
не трогайте фреймворк, правьте свою ошибку!
Вы вынудили меня, при помощи телефона, залезть в исход ники yii и посмотреть что там написано, а мне это было совсем не просто, я вам это припомню :)!
Js, который вы правили, ничего не меняет в названии, оставьте его в покое. Внутри фреймворка используется strrpos точки и результат в substr, т.е. всё ок.
Вы что-то писали про хранение имени в одном поле БД, а расширения в другом? Может быть когда вы пытаетесь получить расширение вы что-то перезаписываете в параметрах CUploadedFile, потом сохраняете? По ссылке что-то передаёте «для повышения производительности»?
Sign up to leave a comment.

Articles