Отправить файл вложения в API мессенджера Facebook в C # - PullRequest
0 голосов
/ 15 октября 2019

Я посмотрел документацию мессенджера на https://developers.facebook.com/docs/messenger-platform/send-messages/#file, чтобы попытаться выяснить, как отправлять локальные вложения. Однако, когда я пробую это с httpclient, я получаю сообщение об ошибке, говорящее, что тело сообщения не может быть пустым, должно предоставить допустимое вложение или сообщение. Ниже мой код

string fileType = ImageExtensions.Contains(Path.GetExtension(url).ToUpper()) ? "image" : "file";

var multipartContent = new MultipartFormDataContent();

var content = new StringContent($"{{\"attachment\":{{\"type\":\"{fileType}\", \"payload\":{{\"is_reusable\"=true}}}}");

multipartContent.Add(new StringContent($"{{\"id\":\"{long.Parse(recipient)}\"}}"), "recipient");
multipartContent.Add(new StringContent($"{{\"attachment\":{{\"type\":\"{fileType}\", \"payload\":{{\"is_reusable\"=true}}}}"), "message");

var file1 = File.ReadAllBytes(url);
var file2 = new ByteArrayContent(file1);

file2.Headers.Add("Content-Type", GetMimeType(Path.GetExtension(url)));

multipartContent.Add(file2,"filedata", Path.GetFileName(url));
request.Content = multipartContent;

Тип файла - изображение, а тип пантомимы - изображение / JPEG. Я знаю, что URL существует, когда я проверил File.exists

1 Ответ

0 голосов
/ 15 октября 2019

Добро пожаловать в переполнение стека!

Из предоставленного примера кода довольно сложно понять, что идет не так, поскольку он не работает в изоляции.

Тем не менее, сначала я проверю, чтоизображение, которое вы потребляете по URL, существует в ожидаемом вами формате. Если вы скачали .jpeg с URL, можете ли вы открыть его на своем компьютере? Предполагая, что он хорошо структурирован, я бы затем попытался разобраться, является ли неправильно сформированный HttpClient или если что-то не так со значениями, которые вы предоставляете для API Facebook.

Вы можете сделать это, создав простоеC # Web API проект, который прослушивает многоэлементную загрузку по определенному маршруту. См. этот ответ для примера кода о том, как это сделать.

Предполагая, что вы можете отправить .jpeg в вопросе между локальным клиентом и локальной конечной точкой, принимающей multipart/form-data, тогда проблема должна заключаться в том, как вы используете сам API Facebook.

В вашем примере я не вижу, чтобы вы где-либо использовали значение переменной content. Является ли это намеренным?

Если эта отсутствующая переменная - красная сельдь, тогда вы можете попробовать выполнить что-то вроде (убедившись, что вы должны поменять значения так, как это необходимо для тех, с которыми у вас проблемы):

using (var httpClient = new HttpClient())
using (var formDataContent = new MultipartFormDataContent()) 
{
    // Read the file in from a local path first to verify that the image
    // exists in the format you're expecting.
    var fileStream = File.OpenRead("/some/path/image.jpeg");
    using (var streamContent = new StreamContent(fileStream)) 
    {
        // Don't actually call `.Result` you should await this, but for ease of
        // demonstration.
        var imageContent = new ByteArrayContent(streamContent.ReadAsByteArrayAsync().Result);
        imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");

        formDataContent.Add(imageContent, "image", "your-file-name-here");
        formDataContent.Add(new StringContent ($"{{\"id\":\"{long.Parse("your-recipient-here")}\"}}"), "recipient");
        formDataContent.Add(new StringContent($"{{\"attachment\":{{\"type\":\"{"image"}\", \"payload\":{{\"is_reusable\"=true}}}}"), "message");

        // Again don't call `.Result` - await it.
        var response = httpClient.PostAsync("https://some-url-here.com", formDataContent).Result;
    }    
}

Если вы выполнили вышеуказанное, вы все еще получаете сообщение об ошибке пустого тела сообщения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...