Intereting Posts

Внедрение полнофункциональной загрузки мультимедиа в веб-приложении

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

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

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

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

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

Для Rails я увидел https://github.com/thoughtbot/paperclip gem, который в Readme говорит:

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

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

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

Я закончил его реализацию следующим образом:

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

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

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

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

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

1UP-лаборатории / OneupUploaderBundle

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

punkave / Symfony2-файл-загрузчик-расслоение

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

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

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

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

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

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