Каков наилучший способ загрузить файл в другое приложение Rails? - PullRequest
1 голос
/ 26 июня 2009

Я исследовал и заметил, что ActiveResource не хватает этой функциональности. Итак, каково текущее состояние дел при загрузке файла?

Одна проблема с подходом Гильермо состоит в том, что запрос должен быть вложенным, например:

body = { :file => {:uploaded_data => File.open("#{RAILS_ROOT}/public/tmp/" + original_filename), :owner_id => current_user.owner_id }, :api_key => '123123123123123123'}

Конечно, с HttpClient невозможно выполнить такой запрос. Я пробовал другие гемы, которые я нашел в github (sevenwire-http-client и technoweenie-rest-client), но у них есть проблемы с вложенным файлом. Можно ли загрузить файл с вложенным запросом?

Ответы [ 2 ]

3 голосов
/ 26 июня 2009

Драгоценный камень Httpclient позволяет вам создавать такие сообщения, как это:

clnt = HTTPClient.new
File.open('/tmp/post_data') do |file|
   body = { 'upload' => file, 'user' => 'nahi' }
   res = clnt.post(uri, body)
 end

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

1 голос
/ 09 июля 2009

Вы можете попробовать что-то вроде следующего:

#I used the HTTPClient gem as suggested (thanks!)
clnt = HTTPClient.new

# The file to be uploaded is originally on /tmp/ with a filename 'RackMultipart0123456789'. 
# I had to rename this file, or the resulting uploaded file will keep that filename. 
# Thus, I copied the file to public/tmp and renamed it to its original_filename.(it will be deleted later on)
original_filename =  params[:message][:file].original_filename
directory = "#{RAILS_ROOT}/public/temporary"
path = File.join(directory, original_filename)
File.open(path, "w+") { |f| f.write(params[:job_application][:resume].read) }

# I upload the file that is currently on public/tmp and then do the post.
body = { :uploaded_data => File.open("#{RAILS_ROOT}/public/tmp/" + original_filename), :owner_id => current_user.owner_id}   
res = clnt.post('http://localhost:3000/files.xml', body)
...