通过浏览器

时间:2017-08-03 16:40:07

标签: ruby-on-rails ruby facebook facebook-graph-api facebook-ads-api

我正在尝试使用Facebook营销API SDK将图像上传到Facebook。

这是sdk

我希望用户能够单击从浏览器中选择文件并通过Rails和SDK运行上传。

基本上,这是我想要做的流程。

  1. 用户选择文件
  2. 点击上传
  3. 后端控制器处理请求并通过API将其上传到Facebook。
  4. 但是,我遇到的问题是,出于安全原因,浏览器无权访问Facebook SDK要求的文件路径。

    ad_account.adimages.create({
      'logo1.png' => File.open('./assets/logo1.jpg')
    }) 
    

    如果我使用内置于Rails或carrierwave中的ActionDispatch::Http::FileUpload,我可以访问tempfile,其名称类似于RackMultipart20170803-89798-1e9hr

    如果我尝试将其上传到Facebook,我会收到错误消息

      

    API不接受此类型的文件

    有没有人知道最佳选择是什么?我唯一能想到的是将文件上传到像cloudinary这样的主机,然后从中获取url并通过cloudinary上传url。

2 个答案:

答案 0 :(得分:1)

你是对的,你的案例的可能解决方案是使用Cloudinary。

Cloudinary的Ruby集成库可作为开源Ruby GEM使用。

要安装Cloudinary Ruby GEM,请运行:

gem install cloudinary

如果使用Rails 3.x或更高版本,请编辑Gemfile,添加以下行并运行bundle。

gem 'cloudinary'

您的cloud_name帐户参数是构建媒体资产的网址所必需的。还需要api_key和api_secret来执行对Cloudinary的安全API调用。

设置配置参数可以在每次调用Cloudinary方法时以编程方式完成,也可以使用位于Rails项目的config目录下的cloudinary.yml配置文件全局完成。

这是一个cloudinary.yml文件的示例:

生产:   cloud_name:"样本"   api_key:" 874837483274837"   api_secret:" a676b67565c6767a6767d6767f676fe1"

直接从浏览器上传是使用Cloudinary的jQuery插件

完成的

http://cloudinary.com/documentation/jquery_integration

为确保您的应用程序授权所有上传,必须首先在服务器端Rails代码中生成安全签名。

完全披露:我在Cloudinary担任软件工程师。

答案 1 :(得分:0)

我找到的解决方案是在public文件夹中创建上传文件的副本,然后从那里进行处理。

uploaded_file = params["file"]
file_name = uploaded_file.original_filename
file_path = File.expand_path(uploaded_file.tempfile.path)
file = File.open("#{FILE_PATH}/#{file_name}", "wb")

file.write uploaded_file.tempfile.read
file.close