0

我正在尝试使用Facebook营销API SDK将图片上传到Facebook。通过Facebook上的营销API通过浏览器上传图片

这是sdk

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

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

  1. 用户选择文件
  2. 键上传
  3. 后端控制器处理该请求,并上传到经由API使用Facebook。

但是,我遇到的问题是,出于安全原因,浏览器无法访问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进行上传。

回答

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 
1

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

Cloudinary的Ruby集成库作为开源的Ruby GEM提供。

要安装Cloudinary Ruby GEM,运行:

gem install cloudinary 

如果您使用的Rails 3.x或更高,编辑您的Gemfile,添加以下行和运行包。

gem 'cloudinary' 

您的cloud_name帐户参数是为媒体资产建立URL所必需的。进一步需要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担任软件工程师。