21:34

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Здравствуйте. Помогите, пожалуйста, разобраться с файлами.

Есть примитивная формочка:

upd: дайри режет код, поэтому картинкой.


Задача формочки - отправка файлов. То есть, пользователи при необходимости выбирают файл и отправляют его на сервер, где его ловит up.php, переименовывает и кладёт в нужную папку.

Задача - надо организовать проверку файла до его отправки на сервер + как-то визуализировать процесс отправки файла (то бишь, прогресс-бар какой-нить, чтобы пользователь видел, что файл закачивается).

Проверку расширения я додумал - просто беру значение поля и дальше идёт анализ строки. С этим проблем нет. Вопрос в том, как можно узнать размер файла ДО отправки формы на сервер? Подскажите пожалуйста. И, если не сложно, объясните как сделать прогресс-бар.

Комментарии
21.04.2012 в 21:44

Sanctus Satanas
Универсально и кроссбраузерно узнать размер файла до загрузки невозможно. И прогресс-бар тоже невозможно.
Возможные решения:
1) Flash
2) HTML5 File API
21.04.2012 в 21:44

fire-dragon
прогресс, + маска файлов + размер
digitarald.de/project/fancyupload/
21.04.2012 в 22:14

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Ясно. Значит с сервером общаться только.
Хорошо, тогда другой вопрос - вот пошла загрузка файла. Как на php узнать, сколько процентов или байт уже загружено?
21.04.2012 в 22:28

fire-dragon
digitarald.de/project/fancyupload/3-0/showcase/...

там есть готовый пхп скрипт
21.04.2012 в 22:31

Sanctus Satanas
Как на php узнать, сколько процентов или байт уже загружено?
А если не секрет, для чего эта информация на php?
21.04.2012 в 22:32

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
Ещё вопрос в догонку. Можно ли как-нибудь сделать так, чтобы после отправки данных с формы, не происходил переход на другую страницу. То бишь, нажал я кнопочку, данные отправились но я на up.php не перехожу. Такое возможно? Какое событие формы надо обработать, чтобы не уходить с текущей страницы?
21.04.2012 в 22:43

Sanctus Satanas
Такое возможно? Какое событие формы надо обработать, чтобы не уходить с текущей страницы?
1) htmlbook.ru/html/form/target (можно, например, отправить в невидимый iframe)
2) Flash
3) HTML5 File API
Разумеется, на всё есть готовые библиотеки. fire-dragon как раз приводит пример с такой либой, основанной на использовании флеша.
21.04.2012 в 22:53

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, fire-dragon, Просто хотелось бы обойтись без сторонних скриптов, используя только встроенное и то, что сам написал.


А если не секрет, для чего эта информация на php?

Для реализации прогресс-бара :shy:
21.04.2012 в 23:00

Sanctus Satanas
Для реализации прогресс-бара
А зачем? Прогресс-бар же на стороне клиента отображается.
21.04.2012 в 23:17

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Ну мне же надо его на основании чего-то строить? Я так понял, узнать сколько уже загружено из общей массы, передать это скрипту и тот установит прогресс-бар в соответствующее положение. Чтобы скорость заполнения прогресс-бара соответствовала степени загруженности файла.
22.04.2012 в 00:03

Sanctus Satanas
Ну дело в том, что PHP — не веб-сервер. Скрипт на нём получает управление уже после того, как браузер отослал HTTP-запрос, в состав которого может входить и файл. Поэтому обращаться к серверу «а сколько там мы уже прислали?» смысла 0, он этого не знает. Да и как? От того, что мы пошлём туда асинхронно ещё пачку запросов ничего не изменится — запущенные параллельно экземпляры скриптов вообще не в курсе, что там кто-то что отправляет.
Зато информацию, разумеется, можно получить на клиенте. Однако простых способов сделать это не существует. Про существующие я уже упомянул. )
22.04.2012 в 00:12

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Ясно. Значит будет просто гифка(

Пока зашёл - ещё вопрос: для input type="file" можно как-нибудь readonly сделать? на текстовых полях работает, а на файловом всё равно позволяет редактировать текст.
22.04.2012 в 00:32

Sanctus Satanas
Ryuzaki_rnd, ну можно, в принципе, перехватить keydown или keypress и не давать туда вводить текст. Правда, это не спасёт от вставки мышкой, например.
22.04.2012 в 00:38

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Тогда иначе - можно сгенерировать какое-нибудь событие? Допустим, если элемент получил фокус, то сгенерить потерю фокуса. Чтобы нельзя было фокус уставновить, а как это делается - пофиг.
22.04.2012 в 00:39

Sanctus Satanas
Ryuzaki_rnd, ну как бы да, фокус же — обычное событие. Только я что-то сейчас сходу не скажу, можно ли тогда будет вообще файл загрузить.
22.04.2012 в 00:41

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, Блин, я забыл, что кнопка и поле - это один элемент :facepalm:
22.04.2012 в 00:42

Sanctus Satanas
Ryuzaki_rnd, ага. С файл-инпутом вообще всё плохо и все про это знают. ) Поэтому придумали кучу костылей. )
Из той же серии — попробуй стилизовать <select>. Флаг в руки, типа. )
22.04.2012 в 01:05

fire-dragon
--==SS==--, да ладно тебе. Пользуйся хаками кнопочку загоняй под див с картинкой. А для селекта по моему даже есть jquery плагин. Нужно кстати покопатся.
22.04.2012 в 01:11

Sanctus Satanas
fire-dragon, для селекта есть до фига плагинов. Я сам даже писал как-то. )
Но надо понимать, что настоящий селект при этом скрывается и его поведение имитируется. Очень часто — не полностью.
22.04.2012 в 01:13

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
--==SS==--, оэтому придумали кучу костылей. )

По костылям у меня скоро будет отдельная пляска - в IE и Хроме, видимо из-за разницы позиционирования, часть элементов пикселей на 30-40 выше, чем надо. Хотя в Огнелисе и Опере всё так, как должно быть. Ну и ещё отдельно 8-й IE выпендривается - текст который в дивах (и в просто дивах, и в таблице из дивов) - нормально отображает, а который в таблице (table/tr/td) отображает жутко мелким + размеры столбцов в обычной таблице не выдерживает. В общем, весело будет. Слава богу отказались от IE ниже 8-го. Ибо иначе ещё и под 6-7 изворачиваться(
22.04.2012 в 01:16

Sanctus Satanas
fire-dragon, а, да, чуть не забыл. Уважающий себя плагин для select'а должен свалить нафиг при открытии через какой-нибудь там айфон. &)

Ryuzaki_rnd
Ибо иначе ещё и под 6-7 изворачиваться(
Ну на российский рынок в этом, к счастью, уже нет особого смысла. А вот те же китайцы до сих пор повально сидят на шестом.
22.04.2012 в 12:57

( . )( . )админ
По костылям у меня скоро будет отдельная пляска - в IE и Хроме, видимо из-за разницы позиционирования, часть элементов пикселей на 30-40 выше, чем надо. Хотя в Огнелисе и Опере всё так, как должно быть. Ну и ещё отдельно 8-й IE выпендривается - текст который в дивах (и в просто дивах, и в таблице из дивов) - нормально отображает, а который в таблице (table/tr/td) отображает жутко мелким + размеры столбцов в обычной таблице не выдерживает.

покурите что такое css reset
22.04.2012 в 13:42

Правильного ответа нет. Любой выбор приводит к жертвам, любое решение требует платы. | Лишь навык имеет значение.
2(che)n, Спасибо. Посмотрю.
22.04.2012 в 22:43

fire-dragon
--==SS==--, мы не заморачиваемся, другой клиент другая вьюха и все делается на уровне контроллера