将变量传递给 S3 get_object_url,意外的字符编码
Passing a variable to S3 get_object_url, unexpected character encoding
不是经验丰富的开发人员并且是第一次使用 CodeIgniter。我正在尝试为存储在 S3 中的给定 MP3 文件名获取签名 URL。这目前正在处理,但包含括号的文件除外。
相关控制器代码:
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 中正确编码,我从 S3 获得 HTTP 200。
知道是什么原因造成的吗?
尝试执行以下操作来解码 url 编码的括号
$data['filename'] = urldecode($url);
这应该 return 字符串为其预期格式,即带括号
In the debug I can confirm that both variables are the same string
实际上,不完全是。
如果仔细观察,url 转义值的含义就很明显了:
%26%2340%3B %26%2341%3B
& # 40 ; & # 41 ;
这些是数字html字符代码,浏览器将显示为(
和)
,但实际上并不意味着这两个字符串具有相同的内容。他们只是看起来。
当然,解决方案取决于它们如何以这种方式进行转换,要么不这样做,要么解码数字字符代码。
不是经验丰富的开发人员并且是第一次使用 CodeIgniter。我正在尝试为存储在 S3 中的给定 MP3 文件名获取签名 URL。这目前正在处理,但包含括号的文件除外。
相关控制器代码:
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 中正确编码,我从 S3 获得 HTTP 200。
知道是什么原因造成的吗?
尝试执行以下操作来解码 url 编码的括号
$data['filename'] = urldecode($url);
这应该 return 字符串为其预期格式,即带括号
In the debug I can confirm that both variables are the same string
实际上,不完全是。
如果仔细观察,url 转义值的含义就很明显了:
%26%2340%3B %26%2341%3B
& # 40 ; & # 41 ;
这些是数字html字符代码,浏览器将显示为(
和)
,但实际上并不意味着这两个字符串具有相同的内容。他们只是看起来。
当然,解决方案取决于它们如何以这种方式进行转换,要么不这样做,要么解码数字字符代码。