我正在尝试使用Facebook营销API SDK将图像上传到Facebook。
这是sdk
我希望用户能够单击从浏览器中选择文件并通过Rails和SDK运行上传。
基本上,这是我想要做的流程。
但是,我遇到的问题是,出于安全原因,浏览器无权访问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 :(得分: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