2013-08-09 4 views
1

Предположим, у нас есть веб-приложение, которое обрабатывает создание, чтение, обновление и удаление статей, и каждая статья должна иметь галерею изображений. Я должен установить отношения между статьей и Галерой между собой и отношение друг к другу между Галереей и СМИ.Внедрение полнофункциональной загрузки медиа в веб-приложении

HTML5 предоставляет множество функций, таких как multiupload, поэтому я хочу использовать этот отличный плагин http://blueimp.github.io/jQuery-File-Upload/ для этого. Проблема в том, как обрабатывать загрузку файла «в памяти», как данные другой формы?

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

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

Другое решение, на мой взгляд, является подходом «с идентификатором редактирования», поскольку мы можем обрабатывать закачки с ранее сохраненным идентификатором галереи, но иногда я не могу сохранить новую пустую статью с галереей, поскольку некоторые из полей должны 't пусто в db.

Для Rails Я видел https://github.com/thoughtbot/paperclip камень, который в Readme говорит:

Paperclip предназначен как простая библиотека вкладываемых файлов для Active Record. Цель этого заключалась в том, чтобы максимально упростить настройку и обрабатывать файлы так же, как и другие атрибуты. Это означает, что они не сохраняются в их конечных местоположениях на диске и не удаляются, если они установлены в нуль, до тех пор, пока не вызывается ActiveRecord :: Base # save.

Мой вопрос в том, как это работает?

ответ

0

У меня нет работы с личным персоналом, но у моего коллеги была аналогичная головоломка. Она использовала

punkave/symfony2-file-uploader-bundle

Это пакет, который wrapps JQuery файла Загрузить плагин. Это на ранних стадиях, и многие вещи отсутствуют, например, событие, но мы дали ему шанс.

Это то, что мы делаем: в newAction() мы создаем сущность, генерируем уникальный идентификатор dir и сохраняем идентификатор в сущности (через обычный setDirId()). Затем мы создаем форму, содержащую скрытый полевой dirId.

Мы загружаем файлы в temp dir на сервере через ajax, а не во время отправки. Для запроса Ajax требуется идентификатор. Он хранит файлы в temp_dir/prefix_ID

Чем это довольно просто. Форма отправляется. Если форма действительна - переместите файлы из temp в dest dir. Если нет - у нас есть ID и они могут показывать изображения.

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

Я знаю, что это не то решение, о котором вы просите. Это скорее обходной путь.

+3

Я бы не рекомендовал этот пакет, то в 'начале stage', поскольку более года. Если вы посмотрите на его UploaderClass, вы увидите, что он не использует никаких стандартов Symfony. – Flask

+0

Вы правы. После разговора с коллегой выяснилось, что этот комплект не очень полезен. Наконец, она написала собственное решение, основанное только на punkave bundle. Извините за путаницу. – tiriana

4

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

я в конечном итоге его реализация, как это:

Учитывая тот факт, что наша проблема возникает из потерянных файлов, я создал Orphanage, который отвечает за управление этими файлами. Загруженные файлы сначала сохраняются в отдельном каталоге вместе с session_id. Это помогает различать файлы для разных пользователей. После отправки формы для создания фактического объекта вы можете получить файлы из приюта, используя только свой идентификатор сеанса. Если форма действительна, вы можете переместить файлы из временного каталога приюта в конечный пункт назначения ваших файлов.

Этот метод имеет ряд подводных камней:

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

Это не окончательное решение этой проблемы, но более обходное решение. По-моему, это чище, чем использование временных сущностей или систем хранения на основе сеансов.

Упомянутый комплект доступен на Github и поддерживает как Orphanage, так и плагин jQuery File Uploader.

1up-lab/OneupUploaderBundle

+0

Хмм этот пакет интересен. Я пытаюсь использовать его с вашим предложением, но как получить URL-адрес веб-сайта для загрузки изображения с помощью gaufrette в UploadListener? –

+0

Я думаю, вам нужно знать базовый url для вашего хранилища Gaufrette. После этого вы можете получить каталог и путь к файлу с помощью метода getKey в файле, извлеченном из события, и собрать обе данные на один веб-путь. (https://github.com/KnpLabs/Gaufrette/blob/master/src/Gaufrette/File.php#L65) – devsheeep

+0

Есть ли какая-либо служба для автоматизации процесса поиска реального пути для файла в gaufrette ?, я не могу видеть это. В VichUploaderBundle в помощнике twig: https://github.com/dustin10/VichUploaderBundle/blob/master/Templating/Helper/UploaderHelper.php существует специальная служба сопоставления свойств, которая строит этот путь из конфигурации ... Я считаю, что проще решение ... –

Смежные вопросы