Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Форма в несколько шагов - как передавать файлы?
 
 автор: G-Style   (26.02.2010 в 02:36)   письмо автору
 
 

Привет всем.

В данный момент я работаю над проектом, в котором есть некая форма. Форма заполняется пользователем поэтапно, т.е. разбита на N шагов. Один из шагов – добавление фотографии. Мне нужен совет, как реализовать передачу файла-фотографии на сервер. А если точнее: пользователь отправляет файл на сервер -> сервер размещает файл во временном хранилище. Хранит он его там до тех пор, пока не будет завершена работа скрипта. Но мне нужно, чтобы файл был доступен и после того, как скрипт завершил работу, ведь есть еще и другие шаги заполнения формы. Логично было бы скопировать файл, но на тот случай если пользователь не станет продолжать заполнять следующий шаг формы, а просто закроет форму (сайт), то файл так и останется на сервере без пользы. А это значит, что теперь каждый раз, когда запускается какой-либо скрипт, он будет проверять, есть ли такие (ненужные) файлы и удалять их. Можно как-либо этого избежать?
Хочется сделать так, чтобы фотография копировалась в нужную директорию на сервере только в том случае, если последний этап формы был успешно завершен, а в противном случае файл удаляется автоматически.

Заранее спасибо за овтет!

  Ответить  
 
 автор: G-Style   (26.02.2010 в 03:04)   письмо автору
 
   для: G-Style   (26.02.2010 в 02:36)
 

Есть такая идея: считать все содержимое файла и передать следующему скрипту, а затем (при удачном завершении задачи) сохранить файл в нужную директорию.

У кого-нибудь есть идеи лучше? Есть ли в данном способе минусы?

  Ответить  
 
 автор: serenya1983   (26.02.2010 в 04:40)   письмо автору
 
   для: G-Style   (26.02.2010 в 03:04)
 

Может так: если пользователь закрыл окно, то удалить файл, если прошел все этапы то оставляем файл!
<body onunload="myfunc()">

  Ответить  
 
 автор: Trianon   (26.02.2010 в 09:04)   письмо автору
 
   для: G-Style   (26.02.2010 в 03:04)
 

Минус - дикий объем данных передачи сервер-клиент-сервер. Скрипт в общем случае может просто не заработать.

Решение - создать и вести таблицу временно загруженных файлов.
Она достаточно легко организуется.
И много записей в ней не окажется по определению.

Как ни странно, с тем же принципом можно даже обойтись без таблицы :)
...Однако Стар мне потом рассказала, что защита эта была вовсе не «магией», а вполне по плечу земной технологии, как только какой-нибудь светлый ум откроет основную идею — что-то вроде «электрифицированной ограды» без ограды. Так же, как радио — это телефон без проводов, но это сравнение, впрочем, не очень подходит....

Р.Хайнлайн, Дорога доблести


С таблицей - проще :)

  Ответить  
 
 автор: Slo_Nik   (26.02.2010 в 04:59)   письмо автору
 
   для: G-Style   (26.02.2010 в 02:36)
 

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

  Ответить  
 
 автор: sim5   (26.02.2010 в 05:37)   письмо автору
 
   для: Slo_Nik   (26.02.2010 в 04:59)
 

Ну и в чем проблема? Вы ведь в состоянии проверить все ли получено из N, следовательно...

  Ответить  
 
 автор: Trianon   (26.02.2010 в 08:39)   письмо автору
 
   для: Slo_Nik   (26.02.2010 в 04:59)
 

Это невсегда удобно психологически.

  Ответить  
 
 автор: FireParanoia   (26.02.2010 в 08:50)   письмо автору
 
   для: Slo_Nik   (26.02.2010 в 04:59)
 

Я бы так и сделал..

На шаге с загрузкой аватара мы получаем значение поля загрузки файла, ну например "C:\images\file.jpg"
Потом мы это значение передаем всем следующим шагам, и естественно после нажатия кнопки "ФИНИШ" мы это значение сохраняем...
Т.е.
Допустим в шаге с загрузкой аватара есть
<input name="filename" type="file" />
, в следующем шаге мы принимаем значение $_FILES["filename"]["tmp_name"] и обязательно его передаем в следующий шаг, можно скрытно.. вот и все

  Ответить  
 
 автор: Trianon   (26.02.2010 в 08:58)   письмо автору
 
   для: FireParanoia   (26.02.2010 в 08:50)
 

> Допустим в шаге с загрузкой аватара есть <input name="filename" type="file" />,
>в следующем шаге мы принимаем значение $_FILES["filename"]["tmp_name"]
>и обязательно его передаем в следующий шаг, можно скрытно.. вот и все

На следующем шаге $_FILES["filename"]["tmp_name"] уже не будет являться именем существующего файла.

  Ответить  
 
 автор: FireParanoia   (26.02.2010 в 09:19)   письмо автору
 
   для: Trianon   (26.02.2010 в 08:58)
 

мде... плохо... не подумал..
а если юзать аякс ?? ну чтобы шаги появлялись не перезагружая страницу?? или не охота возиться с лишними скриптами?
Что-то подобное видел на сайте ruseller.com там куча уроков среди них был и урок по созданию пошаговой рег-формы кажется...
Вот нашел: http://ruseller.com/lessons.php?rub=32&id=432

  Ответить  
 
 автор: sim5   (26.02.2010 в 09:24)   письмо автору
 
   для: FireParanoia   (26.02.2010 в 09:19)
 

Будто без jQuery, Ajax, ну никак не обойтись.

  Ответить  
 
 автор: FireParanoia   (26.02.2010 в 09:25)   письмо автору
 
   для: sim5   (26.02.2010 в 09:24)
 

Ну так подсоби, помоги человеку...

  Ответить  
 
 автор: sim5   (26.02.2010 в 09:25)   письмо автору
 
   для: FireParanoia   (26.02.2010 в 09:25)
 

В чем?

  Ответить  
 
 автор: FireParanoia   (26.02.2010 в 09:26)   письмо автору
 
   для: sim5   (26.02.2010 в 09:25)
 

Ну дык ответь как ему обойтись без аяксов и подобной мути )

  Ответить  
 
 автор: sim5   (26.02.2010 в 09:28)   письмо автору
 
   для: FireParanoia   (26.02.2010 в 09:26)
 

Очень просто - не использовать их. А что касается остального, так я не он, и мне не ведомо, чего и как он пытается делать, а от этого зависит ответ.

  Ответить  
 
 автор: Trianon   (26.02.2010 в 10:04)   письмо автору
 
   для: FireParanoia   (26.02.2010 в 09:19)
 

>мде... плохо... не подумал..

>а если юзать аякс ??
Могу лишь сказать, что Вы не подумали еще раз. И это действительно плохо.

Если применять AJAX - на серверной стороне в смысле проблемы существенно не меняется ничего. Кроме того, что AJAX потребует некоторого, в данном случае - непринципиального, усложнения логики скриптов серверной стороны.
Загруженный файл все равно будет пропадать.

>Что-то подобное видел на сайте ruseller.com там куча уроков среди них был и урок по созданию пошаговой рег-формы кажется...
>Вот нашел: http://ruseller.com/lessons.php?rub=32&id=432

Видели? Вот и применили бы его ... к себе.

  Ответить  
 
 автор: phmaster   (26.02.2010 в 11:14)   письмо автору
 
   для: Trianon   (26.02.2010 в 10:04)
 

Признаться ничего не понял, в скрипте обработчика события нельзя выполнять вставку в таблицу бд и последующую загрузку фотографии ?

  Ответить  
 
 автор: Trianon   (26.02.2010 в 12:01)   письмо автору
 
   для: phmaster   (26.02.2010 в 11:14)
 

последующую загрузку придется выполнять в другом скрипте /экземпляре скрипта.
Автор вопроса, как я понял, этого хочет избежать. Иначе вопрос бы просто не возник.

А если Вы ничего не поняли - стоит перечитать диалог и подумать.

  Ответить  
 
 автор: G-Style   (26.02.2010 в 16:23)   письмо автору
 
   для: Trianon   (26.02.2010 в 12:01)
 

Минус - дикий объем данных передачи сервер-клиент-сервер. Скрипт в общем случае может просто не заработать.

Не совсем так, фотография ограничена по объему в 2Мб. Передается фото на сервер (после обработки) там и остается.

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

Тут есть минусы в том, что последовательность шагов не логична, да и я предпочитаю решить поставленную задачу к желаемому результату.

Ну и в чем проблема? Вы ведь в состоянии проверить все ли получено из N, следовательно...

Извините, вот тут не совсем понял, что следовательно? Закрыл клиент браузер и все, теперь уже скрипт «не знает» о том, что дальше ничего не будет :)

В итоге сделал так (как и писал выше): открываем файл с временного хранилища, считываем содержимое в сессию, продолжаем процесс. На последнем этапе, если данные были успешно помещены в БД, то и файл создаем в нужной директории.

  Ответить  
 
 автор: sim5   (26.02.2010 в 16:41)   письмо автору
 
   для: G-Style   (26.02.2010 в 16:23)
 

Я не думаю, что вы от клиента требуете многотомный архив данных о нем, следовательно, если временным хранилищем выбрать сессию, то:
а) проверить все ли прислано, и стоит ли сохранить в базе, труда не составит.
б) пользователь покинет вас - ну и бог с ним, и до записи не дойдет, и мусор сам по себе канет
в) если "пошаговое" обусловлено большой формой, то это совсем еще не значит, что ее трудно поместить на одной странице - почему бы не дать пользователю возможность открывать ее частями (согласно логике интересующей вас информации), а по заполнении одной части, можно и автоматом открывать слюдущую...
г) если же всетаки пошагово отдавать форму пользователю, то картинку нужно загружать последней
д) редактирование это уже несколько иное
В общем можно всяко яко, но в любом решении я бы использовал сессию, и проблем собственно никаких не вижу.

  Ответить  
 
 автор: G-Style   (26.02.2010 в 17:28)   письмо автору
 
   для: sim5   (26.02.2010 в 16:41)
 

Как я и написал выше – я использовал сессию. И конечно то, что вы написали, что мусор отпадает сам собой (а это именно то, чего я и хотел получить в результате). Форма достаточно большая, и некоторые шаги поделены на открытые и закрытые вкладки (как Вы писали выше). Тут логично было бы разбить на шаги, как я и сделал.
Но теперь у меня назрел другой вопрос (ответ на которые я должен был знать еще давно, но увы…): Данные сессии хранятся в оперативной памяти?

sim5, спасибо за активное участие и помощь! И все остальным, кто принял участие тоже спасибо!

  Ответить  
 
 автор: sim5   (26.02.2010 в 17:44)   письмо автору
 
   для: G-Style   (26.02.2010 в 17:28)
 

Данные сессии хранятся в файле во временной папке.

  Ответить  
 
 автор: Trianon   (26.02.2010 в 18:50)   письмо автору
 
   для: G-Style   (26.02.2010 в 16:23)
 

>>Минус - дикий объем данных передачи сервер-клиент-сервер. Скрипт в общем случае может просто не заработать.

>Не совсем так, фотография ограничена по объему в 2Мб. Передается фото на сервер (после обработки) там и остается.

2 Mб это дикий объем, даже для сессии.


>>Загружать файл на последнем этапе...

Это не моя реплика.

>>Ну и в чем проблема? Вы ведь в состоянии проверить все ли получено из N, следовательно...

Это не моя реплика.

  Ответить  
 
 автор: G-Style   (26.02.2010 в 18:59)   письмо автору
 
   для: Trianon   (26.02.2010 в 18:50)
 

Я подумал, что 2 Мб для сессии это много, но ведь она хранится не в оперативной памяти, поэтому я передумал. Ведь в данный момент сервера уже достаточно мощны, чтобы работать с таким объемом данных, я так думаю… Хотя, наверное, я могу ошибаться. Первое время тогда пока так пусть работает, а если будут наблюдаться проблемы с этим, то будем придумывать другой способ. Способ с таблицами хороший, буду учитывать в дальнейшем данную возможность.

Огромное спасибо, Trianon и sim5!

  Ответить  
 
 автор: sim5   (26.02.2010 в 19:03)   письмо автору
 
   для: G-Style   (26.02.2010 в 18:59)
 

А зачем все 2 МБ картинки, которая как я понял для аватарки, даже в случае, если пользователь ее первой пришлет, хранить? Уж если на то пошло, то все временно хранить в сессии, включая и картинку, но предварительно уменшенную, это никак не 2 МБ будет, места хватит.

  Ответить  
 
 автор: G-Style   (26.02.2010 в 19:33)   письмо автору
 
   для: sim5   (26.02.2010 в 19:03)
 

Не, там не аватар. Там фотография будет. Да там все данные будут в сессии. Да, картинка будет храниться там обработанная, просто я грубо взял на максимум.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования