0

我一直在为此绞尽脑汁,阅读所有我能找到的可用文档,但仍然找不到解决方案,所以我在这里发帖。

首先,我从这里开始,通过 Graph API 发布照片的官方 Facebook 指南。

https://developers.facebook.com/blog/post/498/

因为它是用 PHP 编写的,所以我用 ASP.NET C# 重写了它。该代码的工作原理是照片已成功上传,并且我得到了带有照片 ID 的 JSON 响应。

我需要一种方法来读回这个 ID,所以我想我必须从服务器端上传。但是,这意味着用户需要先上传到我的服务器,然后我的代码会将其发送到 Facebook 的 API。

我的问题是:有没有办法在不先将文件保存到服务器磁盘的情况下做到这一点?由于此时我已经上传了文件的数据缓冲区,我可以以某种方式将其发送到 Graph API 吗?我发现先保存文件然后再次上传是相当多余的。

我想过使用 Javascript/AJAX 来做这件事,但似乎也没有办法。Facebook 的 Javascript API 不提供此功能。

我还尝试查看诸如此类的各种库,但文档相当缺乏。我也看过这篇文章,但它假设我已经有一个文件要上传。

这里的专家可以发布一些示例代码(如果可能的话)或者为我指出我需要的正确方向。在我们讨论这个问题时,有没有办法触发 Facebook 的照片上传对话框,还是我必须从头开始构建自己的?

提前非常感谢。

4

1 回答 1

0

好的,经过一番修补后,我想我找到了解决方案。

在 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>

代码隐藏(身份验证部分是从 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 的完整文档?谢谢!

于 2012-10-10T09:10:47.333 回答