4

我按照以下博客文章了解如何使用我的应用程序远程创建 Facebook 事件。但是,我在从我的应用程序加载图像时遇到问题,因为我的应用程序本地没有存储图像,它们存储在 AWS 中。

    @graph = Koala::Facebook::GraphAPI.new(@token)  
    picture = Koala::UploadableIO.new(@event.photo.url(:small))
    params = {
        :picture => picture,
        :name => 'Event name',
        :description => 'Event descriptio
        :start_time => datetime,
       }

当在我的应用程序上创建 Facebook 事件时,我目前正在使用以下代码将图片发送到 Facebook。然而,问题是 Rails 抛出错误:没有这样的文件或目录 - http://s3.amazonaws.com/ColumbiaEventsApp/photos/21/small.jpeg?1312521889

是否有任何对 Rails 开发经验更丰富的人知道我是否有办法将 URL 视为文件的路径?UploadableIO 类需要一个文件路径,我正在努力弄清楚 Ruby 中是否有办法将 URL 视为文件路径。存储在应用程序上的照片可以加载到 Facebook 的方式如下:

图片 = Koala::UploadableIO.new(File.open("指向您的事件图像的路径"))

如果这有帮助。

我很欣赏对此问题的任何新见解。

4

4 回答 4

9

好的,所以我玩了一下,想出了如何发布图片。

基本上我所做的是使用“open-uri”库将图像链接转换为文件对象,然后可以将其传递给 UploadableIO 并发送到 Facebook。这是有效的代码:

require 'open-uri'
OpenURI::Buffer.send :remove_const, 'StringMax' if OpenURI::Buffer.const_defined?('StringMax')
OpenURI::Buffer.const_set 'StringMax', 0
picture = Koala::UploadableIO.new(open(@event.photo.url(:small)).path, 'image')
params = {
  picture:     picture,
  name:        @event.name,
  description: @event.description,
  location:    @event.location,
  start_time:  datetime
}
@graph.put_object('me', 'events', params )

需要更改 OpenURI 常量 StringMax,因为我使用的图像文件足够小,以至于文件被作为字符串而不是文件对象处理。

希望这可以帮助任何试图解决这个问题的人!

于 2011-08-25T18:54:33.597 回答
4

Koala 1.2.1 是一个非常优雅的解决方案。这是创建相册并从远程 AWS 链接上传到相册的示例代码(顺便说一句,这在 PHP 中使用了 PHP SDK 大约需要 30 行!

@foo = Foo.find(params[:foo_id])        
albuminfo = @graph.put_object('me','albums', :name=>@foo.title)
album_id = albuminfo["id"]    
@graph.put_picture(@foo.remote_image_path,{}, album_id)
于 2011-10-07T17:26:08.090 回答
1

Facebook 最近发布了一个更新,允许您使用可公开访问的 URL ( http://developers.facebook.com/blog/post/526/ ) 发布图片。您使用的 Koala 库支持该功能(https://github.com/arsduo/koala/blob/master/lib/koala/graph_api.rb#L102),因此您应该能够发布您托管的图片在 S3 上,无需使用 OpenURI::Buffer。

于 2011-08-31T09:03:44.377 回答
1

对于 Facebook广告图片,很遗憾您目前无法通过 URL 进行操作,因此:

require 'open-uri'
img_data = open(my_post.image.url :medium).read
img = graph.put_connections('act_X', 'adimages', bytes: Base64.encode64(img_data))
于 2017-12-06T13:58:09.557 回答