Как я могу убедиться, что выгрузка HTTP-файла (например, из нескольких частей и т. д.) является транзакционной? - PullRequest
0 голосов
/ 06 декабря 2009

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

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

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

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

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

Спасибо

Ответы [ 2 ]

1 голос
/ 06 декабря 2009

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

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

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

1 голос
/ 06 декабря 2009

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

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

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