HttpClient将照片WITH消息发布到Facebook Graph

本文关键字:Facebook Graph 消息 照片 WITH HttpClient | 更新日期: 2023-09-27 18:16:59

问题

我正在尝试将一张照片与消息一起上传到Facebook API。

代码段-上传

        requestUri = "https://graph.facebook.com/v2.0/me/photos?access_token=MyAccessToken"
        var streamContent = new StreamContent(fileStream);
        streamContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("form-data")
        {
            Name = "'"files'"",
            FileName = "'"image.jpg'""
        };
        streamContent.Headers.ContentType = new MediaTypeHeaderValue("image/jpeg"); 
        var messageContent = new StringContent("message=HelloWorld");
        var resultJson = webRequestClient.Post(requestUri, new MultipartFormDataContent()
        {
            messageContent,
            streamContent, 
        });

代码-webRequestClient

    public string Post(string uri, HttpContent postData)
    {
        return PostAsync(uri, postData).Result;
    }
    public async Task<string> PostAsync(string uri, HttpContent httpContent)
    {
        string resultStream;
        using (var httpClient = new HttpClient())
        {
            var response = await httpClient.PostAsync(uri, httpContent);
            response.EnsureSuccessStatusCode();
            resultStream = await response.Content.ReadAsStringAsync();
        }
        return resultStream;
    }

票据

  • 如果我删除"messageContent":它会上传图片
  • 如果我使用MultipartContent:它会上传图片,但会忽略我的"消息">
  • 现在不要麻烦我为什么不使用异步功能
  • 当它失败时,我会收到"糟糕"的请求
  • 当我在requestUri中附加"message=helloworld"时,它是有效的,但这不是我的体系结构中处理这个问题的最灵活的解决方案

HttpClient将照片WITH消息发布到Facebook Graph

检查一下,它会解决你的问题,要么你必须通过流发送图像,然后你不需要明确地告诉类型是"images/jpeg"。

protected async void TakePictureAndUpload()
{
    var ui = new CameraCaptureUI();
    var file = await ui.CaptureFileAsync(CameraCaptureUIMode.Photo);
    if (file != null)
    {    
        byte[] myPicArray = await GetPhotoBytesAsync(file);
        HttpClient httpClient = new HttpClient();
        httpClient.BaseAddress = new Uri("http://yourdomainname.com");
        MultipartFormDataContent form = new MultipartFormDataContent();
        HttpContent content = new ByteArrayContent(myPicArray);
        form.Add(content, "media", "filename.jpg");
        content = new StringContent("my-username");
        form.Add(content, "username");
        HttpResponseMessage response = await httpClient.PostAsync("directory/my-site.php", form);
     }
}
public async Task<byte[]> GetPhotoBytesAsync(StorageFile file)
{
    IRandomAccessStream fileStream = await file.OpenAsync(FileAccessMode.Read);
    var reader = new Windows.Storage.Streams.DataReader(fileStream.GetInputStreamAt(0));
    await reader.LoadAsync((uint)fileStream.Size);
    byte[] pixels = new byte[fileStream.Size];
    reader.ReadBytes(pixels);
    return pixels;
}