Ruby - Twitter Gem - 使用INIT,APPEND和FINALIZE命令上传图像

时间:2016-09-30 15:01:02

标签: ruby-on-rails ruby api twitter rubygems

我正在尝试使用Twitter gem和Twitter REST API将简单图像上传到Twitter。我总是收到以下错误Twitter::Error::BadRequest: Segments do not add up to provided total file size.

如果我是对的,我理解在进程结束时(FINALIZE),我上传图片的大小(在APPEND期间)与我在第一时间(在INIT期间)声明的不一样。< / p>

这是我的代码:

file_path = "/Users/folder/image.png"
filesize = File.open(file_path).size
init_request = Twitter::REST::Request.new(TWITTER, :post, "https://upload.twitter.com/1.1/media/upload.json?command=INIT&total_bytes=#{filesize}&media_type=image/png").perform
media_id = init_request[:media_id]

Twitter::REST::Request.new(TWITTER, :post, "https://upload.twitter.com/1.1/media/upload.json?command=APPEND&media_id=#{media_id}&media=#{file_path}.png&segment_index=0").perform

Twitter::REST::Request.new(TWITTER, :post, "https://upload.twitter.com/1.1/media/upload.json?command=FINALIZE&media_id=#{media_id}").perform

任何提示?谢谢!

2 个答案:

答案 0 :(得分:1)

看一下gem的回购中的examples

如果您想使用帖子上传,可以像下面这样简单:

client.update_with_media("I'm tweeting with @gem!", File.new("/Users/folder/image.png"))`

如果你只是想上传并获得media_id的引用,这应该有效:

client.upload(File.new("/Users/folder/image.png"))

答案 1 :(得分:0)

此请求错误:

Twitter::REST::Request.new(TWITTER, :post, "https://upload.twitter.com/1.1/media/upload.json?command=APPEND&media_id=#{media_id}&media=#{file_path}.png&segment_index=0").perform

因为您没有将媒体文件作为多部分数据上传,所以您只将文件路径作为文本发送。 所以,你应该像这样使用Twitter :: REST :: Request:

Twitter::REST::Request.new(TWITTER,
                           :post, "https://upload.twitter.com/1.1/media/upload.json",
                           command: 'APPEND',
                           media_id: media_id,
                           media: File.open(file_path),
                           segment_index: 0).perform