У меня есть файл изображения, хранящийся на S3. Я хочу загрузить этот файл как данные формы на удаленный сайт.

Линия контроллера:

response = RestClient.post("#{BASE_URL}/processImage?language=#{LANGUAGE}&exportFormat=txt", :upload => { :file => File.new(asset.avatar.url) }) 

Asset.avatar.url - это файл со скрепками, хранящийся на S3. Это здесь. Это общедоступно.

Но я продолжаю получать Errno :: ENOENT (Нет такого файла или каталога) с URL-адресом ... это работает!

Я, наверное, упускаю здесь что-то простое. У кого-нибудь есть идеи?

** РЕДАКТИРОВАТЬ: РЕШЕНО **

Я использовал open-uri, а затем просто open (). Он по-прежнему загружается на сервер, но, по крайней мере, работает. И визуально это выглядит проще. знак равно

Вот исправление:

require 'open-uri'
response = RestClient.post("#{BASE_URL}/processImage?language=#{LANGUAGE}&exportFormat=txt", :upload => { :file => open(asset.avatar.url) })  

Open-uri является частью ruby, поэтому вам не нужно устанавливать гем (например, rest-client). Просто потребуйте его в своем коде.

Я подумал, что мне где-то понадобится .read, но кажется , он отлично работает и без него.

2
The One Rob 18 Янв 2013 в 21:13

1 ответ

Лучший ответ

Вам необходимо загрузить файл / содержимое, прежде чем размещать его с помощью RestClient. File.new принимает в качестве аргумента путь к файлу, а не URL-адрес.

1
Pafjo 19 Янв 2013 в 00:58
Да, ты прав. Я надеялся на автоматическое решение Rails. = P
 – 
The One Rob
19 Янв 2013 в 03:50
1
Нашел решение (open-uri), которое не требует загрузки на сервер. Смотрите мою правку.
 – 
The One Rob
20 Янв 2013 в 07:30
Open-uri - это хорошая оболочка для net / http, которая загружает вам контент, когда вы вызываете open (url). Таким образом, контент все равно будет загружен на сервер перед отправкой с помощью RestClient. Кстати, я думаю, вам нужно вызвать "read", чтобы на самом деле прочитать содержимое созданного StringIO-экземпляра.
 – 
Pafjo
20 Янв 2013 в 14:55
Что ж, это определенно была образовательная пара дней. Вы совершенно правы. Это показывает, что 1) мне нужно прекратить чтение документов по скоростному чтению, когда я ищу ответы, и 2) я должен доверять людям с 1500+ баллами ... =)
 – 
The One Rob
21 Янв 2013 в 01:52