Facebook Graph API - 使用 JavaScript 上传照片
是否可以使用 JavaScript 使用 Facebook Graph API 上传文件,我觉得我已经很接近了。我正在使用以下 JavaScript
var params = {};
params['message'] = 'PicRolled';
params['source'] = '@'+path;
params['access_token'] = access_token;
params['upload file'] = true;
function saveImage() {
FB.api('/me/photos', 'post', params, function(response) {
if (!response || response.error) {
alert(response);
} else {
alert('Published to stream - you might want to delete it now!');
}
});
}
运行此命令后,我收到以下错误...
"OAuthException" - "(#324) Requires upload file"
当我尝试研究此方法时,我所能找到的只是一个似乎可以解决此问题的 php 方法
$facebook->setFileUploadSupport(true);
但是,我正在使用 JavaScript,它看起来像此方法可能与 Facebook Graph 权限有关,但我已经设置了 user_photos 和publish_stream 权限,我相信这是执行此操作所需的唯一权限。
我在 stackoverflow 上看到了一些有关此问题的未解答的问题,希望我能足够解释自己。谢谢你们。
Is it possible to upload a file using the Facebook Graph API using javascript, I feel like I'm close. I'm using the following JavaScript
var params = {};
params['message'] = 'PicRolled';
params['source'] = '@'+path;
params['access_token'] = access_token;
params['upload file'] = true;
function saveImage() {
FB.api('/me/photos', 'post', params, function(response) {
if (!response || response.error) {
alert(response);
} else {
alert('Published to stream - you might want to delete it now!');
}
});
}
Upon running this I receive the following error...
"OAuthException" - "(#324) Requires upload file"
When I try and research this method all I can find out about is a php method that apears to solve this
$facebook->setFileUploadSupport(true);
However, I am using JavaScript, it looks like this method might be to do with Facebook Graph permissions, but I already have set the permissions user_photos and publish_stream, which I believed are the only ones I should need to perform this operation.
I have seen a couple of unanswered questions regarding this on stackoverflow, hopefully I can explained myself enough. Thanks guys.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(13)
可以使用 Ajax 将照片上传到 Facebook 个人资料,如下所示。
因此,这是使用 GRAPH API 将照片发布到 Facebook 个人资料的最佳方法,而且也是最简单的方法。
在许多答案中,我看到图像网址由源、图片或图像等显示,但这不起作用。
使用源、图片或图像会导致(#324)需要上传文件错误。
避免 324 错误的最佳方法。
Photos can be uploaded to facebook profile using Ajax as follows.
So this is the best way to post photo to a facebook profile with GRAPH API and is the simple one.
In many answer i have seen that image url is shwon by the source,picture or image etc but that doesn't works.
The use of of source,picture or image leads to a (#324) Requires upload file error .
Best way to avoid the 324 error.
只有@Thiago的答案回答了通过javascript上传数据的问题。我发现 Facebook JS API 不涵盖这种情况。
我也酿造过&测试了我的个人解决方案。
主要步骤
代码
转换实用程序
发送它图像发布片段
用法
额外
提取画布图像的二进制字符串表示
有关如何从
input[type=file]
加载binaryString的信息HTML5 File API 读取文本和二进制
注意:
FormData
&File
方法,但不幸的是在此如果存在很多不兼容性,这使得该过程更难使用,并且您最终会在不一致性周围用管道胶带包裹起来 - 因此我的选择是手动数据组装,因为 HTTP 标准很少改变:)jQuery.ajax
,jQuery.extend
,jQuery.each
Only @Thiago's answer is answering the question of uploading data via javascript. I've found that the Facebook JS API doesn't cover this situation.
I've also brew & tested my personl solution.
Main steps
Code
Conversion utilities
Image posting snippet
Usage
Extra
Extracting the binary string representation of a canvas image
Information on how to load the binaryString from an
input[type=file]
HTML5 File API read as text and binary
Notes:
FormData
&File
approach, but unfortunately in this case there are a lot of incompatilities which make the process harder to use, and you would end up duct-taping around the inconsistencies - thus my choice was manual data assembly since HTTP standards rarely change :)jQuery.ajax
,jQuery.extend
,jQuery.each
是的,您可以将数据发布到 iframe,如此处,或者您可以使用 jQuery 文件上传 。
问题是你无法从 iframe 获得响应,使用插件你可以使用页面句柄。
示例:使用 jQuery 文件上传上传视频
Yes, you can do this posting data to an iframe like here, or you can use jQuery File Upload .
The problem is you can't get response from iframe, using plugin you can use a page handle.
Example: upload a video using jQuery File Upload
要仅使用 Javascript 从本地计算机上传文件,请尝试 HelloJS
http://adodson.com/hello.js/demos/upload.html
To upload a file from the local computer with just Javascript try HelloJS
There's an upload demo at http://adodson.com/hello.js/demos/upload.html
https://stackoverflow.com/a/16439233/68210 包含一个在您需要上传照片数据时有效的解决方案本身并且没有 url。
https://stackoverflow.com/a/16439233/68210 contains a solution that works if you need to upload the photo data itself and don't have a url.
这仍然有效。我使用它的方式如下:
我不得不问你们是否知道这是否可取,或者与使用 Facebook 的 PHP api 相比是否存在很大的安全风险。
This still works. I am using it as below:
I have to ask though if you people have any idea if this is advisable or has a big security risk compared to using PHP api for Facebook.
这有效:
This works:
我似乎也有类似的问题,但上面的解决方案不起作用。
我正在使用 Arrabi 建议的解决方案(仅使用 url 属性)来发布图像,没有任何问题。我的图像每张大约 2-3 MB。
当我将我的应用程序迁移到另一台服务器(更改帖子中图像的绝对 URL)时,对于大小超过 100k 的图像,该方法不断给出 324 错误。
我认为这是由于我的某些 Apache 设置造成的,但是当我将 apache 更改为 lighttpd 时,问题仍然存在。
来自 Facebook 的连接实际上显示在我的 (apache) 日志中:
只有 test2.png 成功。
I seem to have a similar problem, but solutions above didn't work.
I was using the solution suggested by Arrabi (just use the url property only) to post images without any problem. My images are around 2-3 MB each.
When I migrated my app to another server (changing the absolute url of my images in the post) the method kept giving me 324 errors for images above around 100k size.
I thought it was due to some Apache setting on my end, but when I changed apache for lighttpd the problem was still there.
The connections from Facebook actually show up in my (apache) log:
Only test2.png succeeded.
我使用以下内容来分享照片(来自 Phaser 框架的一些 BitmapData)。似乎有效...
I use the following to share a photo (some BitmapData from the Phaser framework). It seems to work...
如果有人仍在寻找如何直接从画布上传到 Facebook 照片,这对我有用:
使用它
修改自:http://gorigins.com/posting-a-canvas-image-to-facebook -和-twitter/
In case anyone still looking for how to upload directly from canvas to Facebook photos, this works for me:
To use it
Modified from: http://gorigins.com/posting-a-canvas-image-to-facebook-and-twitter/
是的,这是可能的,我找到了 2 个解决方案,它们非常相似
对于彼此,您只需将 url 参数定义为外部图像 url
使用 Javascript SDK 的第一个:
和 使用 jQuery Post 请求和 FormData 的第二个:
Yes, this is possible, i find 2 solutions how to do that and they are very similar
to each other, u need just define url parameter to external image url
FIRST one using Javascript SDk:
and SECOND one using jQuery Post request and FormData:
API 说:“要发布照片,请发出 POST 请求照片文件附件为多部分/表单数据。”
FB 期望要上传的图像的字节位于 HTTP 请求的正文中,但它们不在那里。或者换个角度来看 - 在 FB.api() 调用中您在哪里提供图像本身的实际内容?
FB.api() API 的文档很少,并且没有t 提供包含正文的 HTTP POST 示例。人们可能会因为没有这样的例子而推断它不支持这一点。
这可能没问题 - FB.api() 在幕后使用了名为
XmlHttpRequest
的东西,它确实支持包含主体......在您最喜欢的 JavaScript 参考中查找它。但是,您仍然需要解决 2 个子问题:
(顺便说一句,对消息正文进行编码的需要可能就是 PHP setFileUploadSupport(true) 方法的用途 - 告诉
facebook
对象将消息正文编码为multipart/form-data
在发送之前)但它比这更混乱
不幸的是,子问题“2”可能会困扰你 - 没有办法(我上次看)从中提取图像的字节浏览器提供的 Image 对象。
如果要上传的图像可通过 URL 访问,则可以使用 XmlHttpRequest 获取字节。还不错。
如果图像来自用户的桌面,您可能的办法是向用户提供:(
请注意,
source
引用了为文件上传小部件指定的名称)...并希望 FB 能够预期以这种方式接收数据(首先尝试使用静态 HTML 表单,然后再用 JS 动态编码)。人们可能会推断事实上确实如此,因为他们没有提供另一种方法来做到这一点。
The API says: "To publish a photo, issue a POST request with the photo file attachment as multipart/form-data."
FB is expecting that the bytes of the image to be uploaded are in the body of the HTTP request, but they're not there. Or to look at it another way - where in the FB.api() call are you supplying the actual contents of the image itself?
The FB.api() API is poorly documented, and doesn't supply an example of an HTTP POST which includes a body. One might infer from the absence of such an example that it doesn't support this.
That's probably OK - FB.api() is using something called
XmlHttpRequest
under the covers which does support including a body ... look it up in your favourite JavaScript reference.However, you'll still have 2 sub-problems to solve:
(incidentally, the need to encode the message body is probably what the PHP setFileUploadSupport(true) method is for - tell the
facebook
object to encode the message body asmultipart/form-data
before sending)But it's a bit meessier than that
Unfortunately, sub-problem '2' may bite you - there is no way (last time I looked) to extract the bytes of an image from the browser-supplied Image object.
If the image to be uploaded is accessible via a URL, you could fetch the bytes with XmlHttpRequest. Not too bad.
If the image is coming from the user's desktop, your probable recourse is to offer the user a:
(notice that
source
references the name given to the file-upload widget)... and hope that FB anticipated receiving the data in this manner (try it with a static HTML form first, before coding it up dynamically in JS). One might infer that in fact it would, since they don't offer another means of doing it.
我使用@Владимир Дворник代码进行了一些修改,我遇到了同样的问题,并且使用此代码效果很好:
i used @Владимир Дворник code with some modification, I had the same issue and with this code it worked very well: