Я использую Sinatra 1.2.6 в Ruby 1.8.7, и у меня есть что-то вроде клиента Twitter, который я пишу. Я использую Twitter gem версии 1.7.2, написанную Джоном Нунемейкером. Для базы данных ORM я использую Sequel 3.29.0.
В целом все работает отлично. У меня работает хорошая последовательность Oauth, и любой пользователь, который проходит через процесс Oauth, может публиковать твиты в моем приложении.
Однако я не могу на всю жизнь загрузить загрузку мультимедиа с использованием update_with_media. Я пытаюсь загрузить файл изображения с октетным потоком, состоящий из нескольких частей, сохранить его в памяти, а затем передать его в Twitter.
post '/file_upload' do
user_name = params[:user]
if params[:action] == "FILE-UPLOAD"
unless params[:name].match(/\.jpg|png|jpeg/).nil?
#Assume these 3 lines work, and properly authorize to Twitter
current_user = User[:user_name => user_name, :current_account => "1"]
client = current_user.authorize_to_twitter #Handles the Oauth keys/process
client.update("Text status updates work properly")
#Something incorrect is happening in the next two lines.
#I'm either handling the file upload wrong, or posting wrong to Twitter
datafile = params[:file]
client.update_with_media("File upload from Skype: ", datafile)
return "File uploaded ok"
end
end
end
Тем не менее, когда я пытаюсь это сделать, я получаю:
Twitter::Unauthorized - POST https://upload.twitter.com/1/statuses/update_with_media.json: 401: Could not authenticate with OAuth.
Это говорит, что строка, вызывающая эту ошибку, является строкой client.update_with_media.
Я пытаюсь использовать Rack :: RawUpload , но я не знаю, правильно ли я его использую. Если мне не нужно его использовать, я не буду, но я просто застрял. Единственная вещь вне этого фрагмента кода, которая использует это, - это вверху моего кода:
require 'rack/raw_upload'
use Rack::RawUpload
Любая помощь по этому вопросу будет очень цениться. Я также пытался возиться с Tempfile.new (), но это, похоже, не сильно помогло, и я получал либо 401, либо 403 ошибки. Я довольно новичок в Ruby, поэтому было бы полезно как можно точнее рассказать о необходимых изменениях.
Должен заметить, что я хотел бы избежать размещения файла в файловой системе, если это возможно. Я действительно просто передаю сюда загрузку, и мне никогда не нужен доступ в моем сценарии к файлу на диске впоследствии. Хранение файлов в памяти гораздо предпочтительнее.