2009-12-06 2 views
0

Как я могу убедиться, что если я делаю загрузку HTTP-файла (например, скажите, чтобы обновить существующий файл из v1 в моем веб-приложении до версии v2), что он действует транзакционно?Как обеспечить загрузку HTTP-файлов (например, multipart и т. Д.)?

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

Другим способом задать этот вопрос может быть вопрос, могу ли я позволить серверному файлу загрузить код, чтобы указать файл непосредственно туда, куда он должен идти, или независимо от того, (если загрузка HTTP-файла не является транзакцией) мне действительно нужно для добавления дополнительного кода на стороне сервера, чтобы выполнить двухэтапный процесс: (a) загрузить во временное место, а затем (b) в случае успеха затем перенести его в конечное местоположение (но я все равно хочу дать клиенту указание независимо от того, работала ли общая загрузка или нет), и (c) для обновления также есть серверные части для некоторых полей состояния базы данных.

Это, я думаю, является общим вопросом, однако я могу указать, что в моем случае задним концом является приложение Ruby on Rails.

Любые предложения с точки зрения хорошего подхода приветствуются.

Благодаря

ответ

1

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

Все это предполагает, что ваша установка не имеет ничего общего с обычным делом.

Также, если вы можете, вы должны подумать о том, чтобы инвестировать в плагин/драгоценный камень для прикрепления, который может справиться с тяжелым грузом для вас. Я большой поклонник Paperclip.

+0

спасибо - делает ручку скрепки, делая вещи «транзакционными» здесь? – Greg

+0

проверьте с помощью скрепки для бумаги и сделайте это эффективно транзакционным – Greg

1

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

Возможно, вам придется добавить дополнительный код для компенсации неудачных транзакций, таких как очистка файлов, которые не были загружены успешно (сбой в частях a и b), и обновление базы данных из информации о файле, если это возможно, для компенсировать сбои в ходе части c.