Twilio API: невозможно загрузить файл JPEG в MMS - PullRequest
0 голосов
/ 25 ноября 2018

Я создал компонент Lightning для SMS / MMS в Salesforce, который использует Twilio.(Вам не нужно ничего знать о Salesforce, чтобы ответить на этот вопрос.) Я могу отображать входящие изображения MMS, используя MediaUrl.Для этого я просто поместил MediaUrl в тег img в разметке.Оттуда, если я щелкну правой кнопкой мыши по изображению, я могу сохранить его на своем компьютере, и по умолчанию оно будет соответствовать имени файла, которое использовалось при отправке файла.

Теперь я хочу добавить кнопку, чтобы сохранить изображение вФайлы Salesforce (объект ContentVersion).Для этого я делаю HTTP-вызов GET, ожидая получить данные в виде mime-типа image / jpeg, но вместо этого я получаю ответ XML:

<TwilioResponse>
  <Media>
    <Sid/>
    <AccountSid>[myAccountSid]</AccountSid>
    <ParentSid/>
    <ContentType/>
    <DateCreated>Tue, 20 Nov 2018 01:11:04 +0000</DateCreated>
    <DateUpdated>Tue, 20 Nov 201801:11:04 +0000</DateUpdated>
    <Uri>/2010-04-01/Accounts/[myAccountSid]/Messages/MM96803e1b66cf37deb1bcf044799dbf8c/Media/ME46739a78eb197409a4a031896a22cab7</Uri>
  </Media>
</TwilioResponse>

Документы Twilio здесь говорят, что вы можете получить медиа в оригинальном mime-типе, не включая расширение .xml или .json в URL.Я не включаю расширение, и я даже указываю в заголовке mime-тип image / jpeg.Но, тем не менее, я получаю XML.

Итак, я не могу получить реальный носитель, только XML (или JSON) данные о носителе.Я видел другой поток, в котором говорилось, что мне нужно использовать Uri для доступа к данным - но возвращенный Uri - это точно тот же URL-адрес, по которому я первоначально звонил - MediaUrl предоставил при получении MMS.

Второй выпускэто ... как я могу получить это оригинальное имя файла.Браузер знает имя файла (оно появляется по умолчанию, если щелкнуть правой кнопкой мыши и выбрать «Сохранить как ...»), но я не вижу способа получить к нему доступ через API Twilio.

1 Ответ

0 голосов
/ 30 июля 2019

Это происходит, когда используемый вами клиент не выполняет все перенаправления для URL-адреса медиа-объекта.Я использовал PHP с file_get_contents () на сервере PHP 7.3, и он не следовал всем перенаправлениям, как я ожидал.Я получал XML только так, как вы описали.Я перешел на использование Guzzle, и все работало замечательно, используя этот код:

$client = new \GuzzleHttp\Client();
$client->get(
    $url,
    [
        'save_to' => 'test.jpg',
    ]);

Способ, которым я нашел это, использовал библиотеку, с которой я был более знаком, что позволило мне отключить перенаправления, и я получил тот же самый ответ:получал с PHPs file_get_contents ().Как только я обнаружил, что всегда могу получить XML, если перенаправления были отключены, прогресс был намного проще.

Я никогда не мог заставить file_get_contents работать с медиа-URL Twilio и прекратил попытки.Даже указание follow_location с помощью file_get_contents () не сработало (хотя это должно быть по умолчанию). Я пробовал этот код, устанавливая follow_location, а также другие значения заголовков, когда пытался выяснить это НЕ РАБОТАЛ :

$opts = [
    "http" => [
        "follow_location" => '1',
        "header" => "User-Agent: my-awesome-bot/1.0.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close",
    ],
];
$context = stream_context_create($opts);

$media = file_put_contents('test.jpg', file_get_contents($url, false, $context));

# got XML for media object only, not the raw image data in test.jpg

Что касается исходного имени файла, я не думаю, что информация доступна из Twilio.Вполне возможно, что он не сохраняется вместе с загруженным файлом, поскольку все идентификаторы SID объекта, родителя и / или учетной записи указаны во всех API, которые я видел, и в соответствующей документации.

...