我在Ruby 1.8.7中使用Sinatra 1.2.6,我有一些類似於我正在編寫的Twitter客戶端。我使用John Nunemaker編寫的版本爲1.7.2的Twitter gem。對於數據庫ORM,我使用的是Sequel 3.29.0。嘗試在Sinatra上通過POST將圖片上傳到Twitter的問題
總的來說,事情都很好。我有一個很好的Oauth序列,任何通過Oauth過程的用戶都可以將Tweets發佈到我的應用程序中。
我不能爲我的生活獲得媒體上傳使用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相當陌生,所以儘可能清楚地瞭解所需的更改會非常有幫助。
我應該注意,如果可能的話,我想避免將文件放在文件系統上。我真的只是在這裏傳遞上傳文件,之後我不需要在我的場景中訪問磁盤上的文件。保持內存中的文件是首選。
您的twitter應用程序是否有權上傳圖片的權限? – djd
也許是一個愚蠢的問題,但是raw_upload做多部分POST上傳是正確的嗎? – aitchnyu
如果您只是從簡單的腳本上傳媒體,您的代碼是否可以工作? (與Sinatra應用程序相反)。關於Rack :: RawUpload(我是作者),我想說,你首先嚐試沒有它來簡化事情,用正常的文件上傳。只有然後添加它爲鐘聲和口哨。 – pablobm