Хранить файл между http-запросами - PullRequest
4 голосов
/ 01 июля 2010

Представьте себе эту простую форму для загрузки файла:

<form action="upload" enctype="multipart/form-data">
    <input type="text" name="name"/>
    <input type="file" name="file"/>
    <input type="submit"/>
</form>

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

Подумав об этом, я нашел пару возможных решений:

  • Отправьте форму как запрос ajax, затем перейдите на следующую страницу, только если проверка правильна.Проблема в том, что я должен реализовать что-то, чтобы поместить каждую ошибку валидации на место, а не использовать функции MVC (в моем случае теги Spring MVC form.)Если есть ошибка, отправьте страницу с «history.back ()» в javascript.Мой файл снова будет там, но у меня нет простого способа показать сообщения проверки.

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

Что вы думаете?Какое решение лучше?Есть ли хороший (желательно без javascript)?

Спасибо.

Примечание: Я использую Spring MVC 3

Ответы [ 3 ]

4 голосов
/ 01 июля 2010

Это правда, что поле файла будет потеряно, поскольку нет способа предварительно заполнить поле input type="file" в HTML.Это ограничение безопасности, позволяющее избегать джокеров с такими формами:

<form name="upload" action="upload" method="post" enctype="multipart/form-data">
    <input type="file" value="c:/passwords.txt"><input type="submit">
</form>
<script>document.upload.submit()</script>

Ваш единственный способ - отправить форму на фоне , чтобы страница с исходной формой оставалась открытой.Другими словами: Аякс.Для этой задачи доступно несколько библиотек JavaScript, например плагин jQuery Form .Тогда это в основном так же просто, как

$('#formId').ajaxForm();

(да, он будет работать и с загрузкой файлов, тогда этот плагин прозрачно переходит в «режим iframe»)

Но так как вы используетеSpring MVC, который не поддерживает Ajaxical-запросы из коробки, вам нужно будет создать пользовательский ViewResolver на стороне сервера, чтобы он без проблем работал с Ajaxical.Вы можете найти здесь хороший блог, который подробно описывает это.

2 голосов
/ 01 июля 2010

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

А как насчет другой альтернативы: Отправьте form в (невидимый?) Кадр:

<form target="iframe_name_here" ........

<iframe id="iframe_name_here"></iframe>

затем вы можете использовать JavaScript для отправки события "success" изнутри страницы в iframe, например.

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

0 голосов
/ 01 июля 2010

Я не уверен, какой тип проверки вы планируете делать, но разбил бы его на отдельные страницы, например, в мастере, где загрузка файла - последний шаг, сработает?

С Javascript выМожно использовать метод iframe, предложенный Пеккой.Большинство загрузчиков Ajax-файлов, которые я видел, работают таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...