Загрузка файла <input type="upload"> - как сделать что бы файл не пропадал?

StalkerClasses

Новичок
После загрузки файл помещается в папку tmp откуда его нужно переместить уже в нужно место.
Если нужно отправить форму повторно - то файл опять придется прикреплять...

Как лучше всего реализовать алгоритм, что бы загруженный файл уже показывался пользователю и не пропадал при повторной отправке формы?
Без javascript, без jQuery.
 

AnrDaemon

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


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

StalkerClasses

Новичок
Пиши путь в сессию.
Писать tmp-путь?

Нужно сделать так,


Т.е. нужно сохранить файл, когда он загружен, а не когда система считает, что форма полностью готова.
Пример: есть поля:

- имя (заполнено правильно)
- фамилия (заполнено правильно)
- емаил (заполнено не корректно)
- фото (загружен 1 файл)

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

c0dex

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

Но я бы валидировал данные один раз нормально через JS на клиенте + ajax запрос на сервер, чтобы избежать всего этого геморроя.
 

Valick

Новичок
Но я бы валидировал данные один раз нормально через JS на клиенте
c0dex, ты сейчас дал гранату без чеки в руки ТС. Ни одна валидация на клиенте не отменяет валидацию на сервере, мы то это знаем, но StalkerClasses когда не надо всё понимает буквально.

StalkerClasses, при первом обращении к форме присваиваешь ей уникальный идентификатор (например идентификатор пользователя) и записываешь его в сессию. Как уже сказали сохраняешь загруженный файл в свою временную директорию и при повторном обращении к форме смотришь на то, есть ли уже загруженный файл или нет, если есть, то пишешь об этом и вместо инпута для ввода файла выводишь ссылку на удаление этого файла (если можно несколько файлов, то + input), как только форма удовлетворяет всем параметрам валидации, то переносишь файл(ы) куда надо и удаляешь из сессии параметры относящиеся к этой форме.
По итогу каждый пользователь в твоей временной директории может хранить, только один (или несколько если разрешена мультизагрузка) временный файл относящийся к этой форме.
Мусор например можно чистить ночью, пока никто не видит.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Я там написал совершенно однозначно "через JS на клиенте + ajax запрос на сервер " =D Как там человек понимает написанное, это уже к нему вопросы.
 
  • Like
Реакции: AmdY

AmdY

Пью пиво
Команда форума
Я там написал совершенно однозначно "через JS на клиенте + ajax запрос на сервер " =D Как там человек понимает написанное, это уже к нему вопросы.
по вредыдущему опыту, подозреваю что файлы будут загружаться сразу в основное хранилище и там устроят помойку.

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
по вредыдущему опыту, подозреваю что файлы будут загружаться сразу в основное хранилище и там устроят помойку.

Тут самое важное, что без аяксов, люди всё равно будут повторно прикреплять файл. не зная о магии на стороне сервера.
Кхм, ну без аяксов я сейчас не видел ни одного серьезного сайта. Ну а как там ТС сделает это уже его дело.
 

fixxxer

К.О.
Партнер клуба
Это же рубрика «вредные советы в топиках Сталкера»?

Можно класть временные загруженные файлы в session.save_path с префиксом sess_, тогда они удалятся автоматически в процессе session gc. А если их называть по шаблону sess_$sessionId_$formId, где formId некий уникальный идентификатор конкретной формы, тогда даже в сессии ничего специального хранить не надо.
 

AmdY

Пью пиво
Команда форума
Это же рубрика «вредные советы в топиках Сталкера»?

Можно класть временные загруженные файлы в session.save_path с префиксом sess_, тогда они удалятся автоматически в процессе session gc. А если их называть по шаблону sess_$sessionId_$formId, где formId некий уникальный идентификатор конкретной формы, тогда даже в сессии ничего специального хранить не надо.
Слишком сложно, тогда уж лучше просто класть содержимое файла в сессию
PHP:
$_SESSION['tmp_file'] = file_get_contsnts($_FILES['upload']['tmp_name']))
 

fixxxer

К.О.
Партнер клуба
Слишком сложно, тогда уж лучше просто класть содержимое файла в сессию
PHP:
$_SESSION['tmp_file'] = file_get_contsnts($_FILES['upload']['tmp_name']))
Да, отличный способ, только в php.ini надо отключить memory_limit. Как всегда в этом вашем php понаделали настроек, которые по дефолту мешают писать эффективный код.
 

weregod

unserializer
Да, отличный способ, только в php.ini надо отключить memory_limit. Как всегда в этом вашем php понаделали настроек, которые по дефолту мешают писать эффективный код.
Дык не Perl, который умел переменные в файлухе хранить, если ничего не путаю.
 

Фанат

oncle terrible
Команда форума
Мне уже давно кажется, что наш визави устроился работать проксей на какой-то таджикский форум по пэхапе за файрволлом.
Ну или сдаёт свою учётку за малый прайс.
 

Yoskaldyr

"Спамер"
Партнер клуба
Мне уже давно кажется, что наш визави устроился работать проксей на какой-то таджикский форум по пэхапе за файрволлом.
Ну или сдаёт свою учётку за малый прайс.
Вы тут все смеетесь, а вдруг действительно так? :)
 
Сверху