Как я могу загрузить файл в приложение ruby ​​on rails, используя curl CLI? - PullRequest
9 голосов
/ 20 января 2012

В Интернете у меня есть два поля: имя и документ. Документ - это поле файла, а имя - это то, что пользователь хочет вызвать в приложении файл.

Вот что я пробовал:

curl -F "media[document]=@a.png" -F "media[name]=api" "http://example.com/medias/create.xml?api_key=123"

но я получаю ошибку InvalidAuthenticityToken. Эта ошибка возникает только при попытке загрузить файл / создать медиа-объект. Другие команды API / xml работают (те, которые не включают файлы)

Как правильно загрузить файл с помощью cURL?

EDIT: добавление -H "Content-Type: application / xml" к приведенной выше команде curl заставляет сервер генерировать эту ошибку:

/!\ FAILSAFE /!\  Tue Jan 24 08:45:03 -0500 2012
  Status: 500 Internal Server Error
  #<REXML::ParseException: malformed XML: missing tag start
Line: 
Position: 
Last 80 unconsumed characters:
<:??OH?ɽ?H? ???g??yx~t????op?.$?????P&W ??"?

обычно XML предоставляется с использованием аргумента -d. но я не думаю, что файлы могут быть включены в XML? может они могут? ИДК.

Ответы [ 3 ]

9 голосов
/ 30 января 2012

Если вы хотите создать файл из xml, вам следует отформатировать ваш xml, чтобы использовать data , либо Base64 и / или CDATA , в зависимости от ваших потребностей , Если у вас есть правильно отформатированный XML-файл, вам просто нужно отправить его с помощью curl.

Если вы просто хотите загрузить файл, вам не нужно использовать интерфейс xml. Вы можете просто позвонить:

curl -F "media[document]=@./a.png;type=image/png" -F "media[name]=api" "http://example.com/medias/

Если у вас проблема с аутентификацией, но у вас она еще есть по этому URL-адресу (я не сталкиваюсь с ней в новом свежем приложении rails 3.2.1), вы можете получить к ней доступ через обычный браузер, получить информацию о файлах cookie и отправить их с локон. Это означает, что вы добавите к своей команде:

--cookie "csrf-param=authenticity_token" --cookie "csrf-value=XXXXXXX"

Или воспользуйтесь удобным сценарием для отправки всех ваших текущих файлов cookie Firefox с хоста в curl.

3 голосов
/ 24 января 2012

Rails использует маркер подлинности для предотвращения CSRF .Он вставляет в каждую форму специальный токен, рассчитанный на основе сеанса текущего пользователя, и проверяет его при поступлении запроса на сервер.

Когда вы выполняете POST-запрос, используя curl, вы получаете эту ошибку, поскольку вы не передаете действительный токен аутентификации на сервер.Вы можете либо отключить эту защиту для вашего метода подобным образом (обратите внимание, что ее отключение сделает это действие уязвимым для CSRF):

protect_from_forgery :except => :some_action

или вы можете использовать ninja магия для передачи действительного токена подлинности на сервер.

Другой вариант основан на том факте, что Rails проверяет токен подлинности только для запросов с определенными типами содержимого.Если это API, и вы получаете ответ в JSON, вы можете попробовать установить тип содержимого запроса на application/json, например:

curl -H "Content-Type: application/json" ...

См. Эти ссылки для получения дополнительной информации: one , два , три .

2 голосов
/ 24 января 2012

Вам необходимо отключить токен подлинности для действия.Используйте это в вашем контроллере (я предполагаю, что действие называется create):

protect_from_forgery :except => [:create]

Это происходит только с запросами POST, PUT или DELETE, поэтому, вероятно, другие запросы успешны.

Если это API, вы можете полностью его отключить.Вы можете удалить protect_from_forgery в вас ApplicationController.

Маркер подлинности используется для (в некоторой степени) обеспечения того, что пользователь изменяет форму при изменении ресурсов.Приложение создает случайный токен, связанный с сеансом пользователя, и помещает его в скрытое поле формы.Когда форма отправлена, токен сравнивается с токеном, сохраненным в сеансе, чтобы выполнить проверку.Это не будет иметь никакого смысла в API.

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