Comments 31
Может быть глупый вопрос задам, но зачем yii обрезает расширение?
В подробности не вдавался, но судя по всему имя файла разбивается по точкам в массив, а при сохранении вероятно собирается из двух первых элементов — в результате получаем следующее: взяли test.php переименовали в test.php.jpg, он залился и на сервере обозвался test.php.
Поправьте если не прав, но насколько помню расширение(последний элемент массива) отсекается вообще.
Нет, это я понял. Я не очень понимаю для чего yii вообще это делает. То есть если заливают файл 123.jpg, то да, он сохранится как 123, но вопрос в том почему бы его не хранить как 123.jpg?
Сам недавно разбирался в yii-based системе и не понял для чего нужны эти выкрутасы. По крайней мере с картинками.
Сам недавно разбирался в yii-based системе и не понял для чего нужны эти выкрутасы. По крайней мере с картинками.
Yii сам ничего не делает, jquery.multifile.js лишь «управляет» инпутами, а CUploadedFile сохрает под нужным именем, как надо сохранять чтобы обрезалось имя?
Какой-то непонятный костыль, это получается что файл 14.11.2011.jpg будет считаться неверным типом?
Да и править нужно не javascript, а php библиотеку.
Да и править нужно не javascript, а php библиотеку.
Считаете 14.11.2011.jpg — это нормальное имя файла? А javascript правил потому что в данном случае эти проверки происходят именно там и логично было бы там и поправить.
А чем оно ненормально? От этого фотография перестанет быть фотографией?
Ваша проверка обходится за одну секунду.
Ваша проверка обходится за одну секунду.
Вы yii скачивали с официального сайта? Посмотрите, как называется файл ;)
yii-1.1.9.r3527.tar.gz или вы качали yii-1.1.9.r3527.zip?
yii-1.1.9.r3527.tar.gz или вы качали yii-1.1.9.r3527.zip?
ну я так понимаю что проблема не решена, вы только запретили загрузку двойного расширения на стороне клиента (javascript), а проблема думаю так и осталась и есть возможность загрузить файл на «прямую» обратившись к скрипту.
возможно ошибаюсь, не работал с данным фреймворком
возможно ошибаюсь, не работал с данным фреймворком
т.е складывать фаил в папку где нельзя вообще выполнять скрипты не вариант?
Хочу ответить сразу всем кто пишет решена ли проблема или не решена, можно ли обойти защиту или нельзя. Проверку на уровне пхп мы сделаем — как мы ее сделаем к данной статье отношения не имеет, а имеет отношения к нашему конкретному случаю (приложению). Темой топика изначально является баг в виджете CMultiFileUpload, который генерирует поле для аплоада на сервер нескольких файлов одновременно. Смотрим доку и видим что CMultiFileUpload работает на базе jQuery Multi File Upload plugin. Мы нашли ошибку именно в js коде, предложили решение как ее там же в js коде исправить. В чем проблема?
Почему вы решили, что ошибка в js коде? Ваше решение не исправляет, а добавляет ошибку — теперь нельзя будет загрузить файлы с более чем одной точкой в имени.
Потому что читайте внимательно комментарии выше, ваш файл с несколькими точками в любом случае зальется с искажением названия и с другим расширением в результате, но все таки зальется. Данное же решение позволяет правильно работать свойству виджета accept.
Читаю комментарии выше. Нигде не вижу исправления ошибки искажения названия. Вижу только то, что вижу — вами добавлен новый баг.
Ну или как по вашему должно правильно работать свойство accept при имени файла содержащем более чем одну точку?
Ну или как по вашему должно правильно работать свойство accept при имени файла содержащем более чем одну точку?
Берем файл test.php.jpg который является пхп скриптом с измененным именем файла и закачиваем его на сервер. accept пропускает его, но в результате на сервере лежит файл под названием test.php. По-вашему это нормально и можно так и оставить, но зато будет возможность закачать файл 14.11.2011.jpg, который опять же после закачки станет файлом 14.11, получается так?
А если выяснится, что при загрузке файлов содержащих символ «а» данное расширение удаляет index.php — запретите загрузку файлов с этим символом?
Зачем вообще обрезать расширение? Да и вообще хранить файл с оригинальным именем, коллизии названий, проблемы с кириллицей…
script.min.js или archive.tar.gz искаженное?
Нет, расширением является по, что идет после последней точки и это довольно частая ошибка, не раз видел код:
В случае с картинками точка в имени действительно редкое явление, но это не значит, что ее не может быть.
В данном случае ошибка в серверной части, причем, похоже это только ваша ошибка, jQuery Multiple File Upload никак не искажает название файла.
Нет, расширением является по, что идет после последней точки и это довольно частая ошибка, не раз видел код:
$a = explode($basename);
$filename = $a[0];
$ext = $[1];
В случае с картинками точка в имени действительно редкое явление, но это не значит, что ее не может быть.
В данном случае ошибка в серверной части, причем, похоже это только ваша ошибка, jQuery Multiple File Upload никак не искажает название файла.
Ну как бы все это происходит в нашем случае вот в этом файле jquery.multifile.js
Тогда такой вопрос — причём здесь Yii?
Да и, насколько я помню, доки по multifile настоятельно рекомендуют делать серверную проверку расширений.
Да и, насколько я помню, доки по multifile настоятельно рекомендуют делать серверную проверку расширений.
В jquery.multifile.js вообще нет кода отвечающего за отправку файла, единственное что он делает скрывает выбранный инпут:
подменяя его на div.MultiFile-label с полным именем файла, выбрав «test.php.jpg» — видно «test.php.jpg», на сервер будет отправляться обычная форма с множественными файлами, соответственно на сервер будут передано настоящее имя файла, в чем легко убедиться сделав «var_dump($_FILES); die();», где опять же видим «test.php.jpg».
// 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, потом сохраняете? По ссылке что-то передаёте «для повышения производительности»?
Вы вынудили меня, при помощи телефона, залезть в исход ники yii и посмотреть что там написано, а мне это было совсем не просто, я вам это припомню :)!
Js, который вы правили, ничего не меняет в названии, оставьте его в покое. Внутри фреймворка используется strrpos точки и результат в substr, т.е. всё ок.
Вы что-то писали про хранение имени в одном поле БД, а расширения в другом? Может быть когда вы пытаетесь получить расширение вы что-то перезаписываете в параметрах CUploadedFile, потом сохраняете? По ссылке что-то передаёте «для повышения производительности»?
Sign up to leave a comment.
Yii 1.1.8 — загрузка файлов с произвольным расширением с помощью CMultiFileUpload