Загрузка файлов из пользовательского тега формы в Spring MVC - PullRequest
1 голос
/ 19 августа 2011

Контекст

Часть административной части нашего приложения требует, чтобы пользователь редактировал различные типы контента , что включает использование текстового редактора или файлов для генерации контента, который может видеть «клиентская сторона» пользователи приложения. Это своего рода CMS Lite для конкретного домена.

Поскольку этот «контент» может использоваться в различных частях приложения, он включен в качестве отдельного отношения в некоторые из наших доменных сущностей. Мы решили создать собственную библиотеку тегов, которая определяет некоторые поля формы, которые можно использовать для редактирования этого содержимого, когда администратор редактирует объект, содержащий часть содержимого.

Вопрос

То, что мы хотели бы сделать, это следующее.

<form:form modelAttribute=...>
    <olo:content-editor path="content"/>
    <!-- Other form fields for this entity -->
    <form:.../>
    <form:.../>
</form:form>

Тег olo:content-editor затем генерирует количество полей формы в зависимости от того, какой тип содержимого требуется. Это означает, что он может (или, в зависимости от типа содержимого, не может!) Генерировать тег filebased-content, который содержит:

<input type="file" name="file/>

Который может использоваться для замены файла, связанного с содержимым на основе файла.

Проблема в том, что документы Spring указывают, что для загрузки файла требуется, чтобы в форме был enctype, чтобы определить, что он отправляет данные многочастной формы. Поскольку загрузка файла является частью тега , а не самой формой , мы считаем это нежелательным. Мы хотели бы иметь возможность использовать наш тег olo:content-editor в формах без необходимости изменять атрибут формы enctype. Это возможно?

Возможные решения

Мы можем вспомнить два хака на стороне клиента, которые могут решить нашу проблему, но оба выглядят довольно некрасивыми решениями:

  • Включите в тег содержимого на основе файла скрипт, который при загрузке изменяет форму enctype, чтобы он всегда был установлен на соответствующий тип. (Очень некрасиво.)
  • Отправьте данные файла в виде обычного скрытого поля формы, данные которого задаются с помощью API-интерфейса файлов HTML5 (администраторы используют совместимый браузер. Это выглядит гораздо менее уродливо, но все же не является оптимальным решением.)
...