从具有重定向的 URL 保存文件

Save File From URL that has a redirection

我正在尝试保存通过 Twilio 发送的所有媒体的本地副本。

$media = file_get_contents($mediaUrl);
$filename = $mediaSid . '.' . $fileExtension;
file_put_contents(public_path('storage/mms/' . $filename), $media);

问题是 file_get_contents 似乎没有跟随重定向,所以我得到一个包含 TwiML 的文件。我在下面有一个我不断得到的例子。我的问题是我需要使用什么功能才能遵循重定向并且我得到媒体的实际数据而不是 XML?

创建的文件:

<?xml version='1.0' encoding='UTF-8'?>
<TwilioResponse><Media><Sid/><AccountSid>AC....</AccountSid><ParentSid/><ContentType/><DateCreated>Fri, 08 Nov 2019 01:49:02 +0000</DateCreated><DateUpdated>Fri, 08 Nov 2019 01:49:02 +0000</DateUpdated><Uri>/2010-04-01/Accounts/AC.../Messages/MM.../Media/ME...</Uri></Media></TwilioResponse>

根据 Twilio 支持,建议使用 libcurl 而不是 file_get_contents 来解决此特定问题。

原因是 Twilio 发送了一个超过 1024 个字符的临时 URL 并且被忽略了。

$mediaUrl = "https://api.twilio.com/2010-04-01/Accounts/ACxxxxxxx/Messages/MMxxxxxxxxxxx/Media/MExxxxxxxxxxxxx";

$accountSid = "ACxxxxxxxxxxxxxxx";
$authToken = "...";

$curl = curl_init();
$outfile = fopen('temp.jpg', 'w+');
$options = array(
    CURLOPT_HTTPGET => true,
    CURLOPT_URL => $mediaUrl,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
    CURLOPT_USERPWD => "$accountSid:$authToken",
    CURLOPT_FILE => $outfile
);
curl_setopt_array($curl, $options);
curl_exec($curl);
curl_close($curl);