Передача переменной в S3 get_object_url, неожиданная кодировка символов

Не опытный разработчик и использующий CodeIgniter впервые. Я пытаюсь получить подписанный URL для данного имени файла MP3, хранящегося в S3. В настоящее время это работает за исключением файлов, которые содержат скобки.

Соответствующий код контроллера:

function index ($streamfile) {
// Load S3 client
$this->load->spark('amazon-sdk');
$s3 = $this->awslib->get_s3();

// Define request parameters
$s3bucket = $userdata['s3bucket']; // defined elsewhere
$streamfiletest = ($string)'Crazy_(Remix).mp3';

// Request signed URL
$url = $s3->get_object_url($s3bucket, ***EITHER $streamfiletest or $streamfile***, '5 minutes');

// Fetch status code
$http = new CFRequest($url);
$http->add_header('Content-Type', '');
$http->send_request(true);
$code = $http->get_response_code();
$headers = $http->get_response_header();

// Load the view
$data['filename'] = $url;
$data['debug'] = array(
'file1' => $streamfile,
'file2' => $streamfiletest,
'signed_url' => $url,
'code' => $code,
'headers' => $headers
);
$this->load->view('play', $data);

Соответствующий код просмотра:

<?php if (isset($debug)) {
echo "DEBUGS:";
echo '<pre>' . print_r($debug, TRUE) . '</pre>';
} ?>

Как видите, я передаю либо $ streamfile, либо $ streamfiletest. В отладке я могу подтвердить, что обе переменные — это одна и та же строка.

При передаче $ streamfile в запрос URL-адреса URL-адрес в ответе неверен:

DEBUGS:
[file1] => Crazy_(Remix).mp3
[file2] => Crazy_(Remix).mp3
[signed_url] => http://s3-...(removed)/Crazy_%26%2340%3BRemix%26%2341%3B.mp3?AWSAccessKey...
[code] => 404

Вы можете видеть, что скобки были странно закодированы % 26% 2340% 3B и поэтому я не могу найти файл в S3.

Однако при передаче $ streamfiletest ответ будет хорошим:

DEBUGS:
[file1] => Crazy_(Remix).mp3
[file2] => Crazy_(Remix).mp3
[signed_url] => http://s3-...(removed)/Crazy_%28Remix%29.mp3?AWSAccessKey...
[code] => 200

Скобки правильно указаны в подписанном URL, и я получаю HTTP 200 от S3.

Есть идеи, что может быть причиной этого?

0

Решение

В отладке я могу подтвердить, что обе переменные являются одной и той же строкой

На самом деле, не совсем.

Если вы внимательно посмотрите, станет ясно, что должны означать экранированные значения url:

%26%2340%3B %26%2341%3B
&  # 40 ;   &  # 41 ;

Это числовые HTML-коды символов, которые браузер будет отображать как ( а также ) но на самом деле это не означает, что две строки имеют одинаковое содержание. Они только кажутся.

Решение, конечно, зависит от того, как они преобразуются таким образом, и либо не делают этого, либо декодируют числовые коды символов.

0

Другие решения

Попробуйте выполнить следующее, чтобы декодировать закодированные в URL скобки

$data['filename'] = urldecode($url);

Это должно вернуть строку в ожидаемый формат, то есть в скобках

0