我一直在思考这个问题,并阅读了我能找到的所有可用文档,但仍然找不到解决方案,所以我在这里发帖。
首先,我从这里开始,这是通过Graph API发布照片的官方Facebook指南。
https://developers.facebook.com/blog/post/498/
由于它是用PHP编写的,所以我用ASP.NET C#重写了它。代码的工作原理是照片上传成功,我得到了带有照片ID的JSON响应。
我需要一种方法来读取这个ID,所以我想我必须从服务器端进行上传。然而,这意味着用户需要首先上传到我的服务器,然后我的代码会将其发送到Facebook的API。
我的问题是:有没有一种方法可以在不首先将文件保存到服务器磁盘的情况下做到这一点?由于此时此刻我已经上传了文件的数据缓冲区,我可以以某种方式将其发送到Graph API吗?我觉得先保存文件然后再上传是很多余的。
我曾想过使用Javascript/AAJAX来实现这一点,但似乎也没有办法。Facebook的Javascript API没有提供这一点。
我还试着查看了类似这样的各种库,但文档相当缺乏。我也看过这篇文章,但它假设我已经有一个文件要上传。
这里的专家可以发布一些这样做的示例代码吗(如果可能的话),或者为我指出我需要的正确方向。当我们讨论这个问题时,有没有办法触发Facebook的照片上传对话框,或者我必须从头开始建立自己的对话框?
提前非常感谢。
好吧,经过一些修改,我想我找到了解决方案。
在aspx 中
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="upload.aspx.cs" Inherits="photocontest_upload" %>
<!DOCTYPE HTML>
<html lang="en">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
File: <asp:FileUpload ID="fileUpload" runat="server" /><br />
Caption: <asp:TextBox ID="caption" runat="server"></asp:TextBox><br />
<asp:Button id="btnSubmit" runat="server" onclick="btnSubmit_Click" text="Upload" />
</div>
</form>
<asp:Literal ID="msg" runat="server"></asp:Literal>
</body>
</html>
Codebein(认证部分是从Facebook提供的示例PHP代码转换而来的。)还没有错误处理
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using Facebook;
public partial class photocontest_upload : System.Web.UI.Page
{
protected string access_token = "";
protected string form_url = "";
protected void Page_Load(object sender, EventArgs e)
{
string app_id = "your_app_id";
string app_secret = "your_app_secret";
string post_login_url = "your_post_login_url";
string code = Request["code"] ?? "";
if (code == "")
{
string dialog_url = "http://www.facebook.com/dialog/oauth?" + "client_id=" + app_id + "&redirect_uri=" + Server.UrlEncode(post_login_url) + "&scope=publish_stream";
Response.Redirect(dialog_url);
}
else
{
string token_url = "https://graph.facebook.com/oauth/access_token?client_id=" + app_id + "&redirect_uri=" + Server.UrlEncode(post_login_url) + "&client_secret=" + app_secret + "&code=" + code;
string response = InstaSharp.HttpClient.GET(token_url);
access_token = HttpUtility.ParseQueryString(response).Get("access_token");
form_url = "https://graph.facebook.com/me/photos?access_token=" + access_token;
}
}
protected void btnSubmit_Click(object sender, EventArgs e)
{
if (fileUpload.HasFile)
{
FacebookClient facebookClient = new FacebookClient(access_token);
FacebookMediaObject mediaObject = new FacebookMediaObject
{
FileName = "file.jpg",
ContentType = "image/jpeg"
};
mediaObject.SetValue(fileUpload.FileBytes);
IDictionary<string, object> upload = new Dictionary<string, object>();
upload.Add("name", caption.Text);
upload.Add("@file.jpg", mediaObject);
dynamic res = facebookClient.Post("/me/photos", upload) as JsonObject;
form1.Visible = false;
msg.Text = "<p>Photo uploaded successfully. " +
"<a href="https://www.facebook.com/photo.php?fbid=" + res.id + "">View on facebook</a><p>" +
"<p><a href="upload.aspx">Back</a>";
}
}
}
这似乎有效,但我仍然没有关于FacebookMediaObject和facebookClient()参数应该是什么的详细信息。有人知道我在哪里可以获得Facebook C#SDK的完整文档吗?谢谢