Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将变量传递给S3 get_object_url,意外的字符编码_Php_Codeigniter_Amazon Web Services_Amazon S3_Aws Sdk - Fatal编程技术网

Php 将变量传递给S3 get_object_url,意外的字符编码

Php 将变量传递给S3 get_object_url,意外的字符编码,php,codeigniter,amazon-web-services,amazon-s3,aws-sdk,Php,Codeigniter,Amazon Web Services,Amazon S3,Aws Sdk,不是一个经验丰富的开发人员,并且第一次使用CodeIgniter。我正在尝试获取存储在S3中的给定MP3文件名的签名URL。除包含方括号的文件外,此操作目前正在运行 相关控制器代码: function index ($streamfile) { // Load S3 client $this->load->spark('amazon-sdk'); $s3 = $this->awslib->get_s3(); // Define reque

不是一个经验丰富的开发人员,并且第一次使用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>';
} ?>
您可以看到括号的编码很奇怪%26%2340%3B,因此我在S3中找不到该文件

但是,当通过$streamfiletest时,响应良好:

$data['filename'] = urldecode($url);
括号在签名URL中正确编码,我从S3获得HTTP 200


你知道这是什么原因吗?

试着执行以下操作来解码url编码的括号

%26%2340%3B %26%2341%3B
 &  # 40 ;   &  # 41 ;
这会将字符串返回到预期的格式,即带括号的格式

在调试中,我可以确认两个变量是相同的字符串

事实上,不完全是这样

如果仔细观察,就会发现url转义值的含义:

这些是数字html字符代码,浏览器将显示为
,但实际上并不意味着这两个字符串具有相同的内容。它们只不过是表面上的


当然,解决方案取决于它们如何以这种方式进行转换,或者不这样做,或者解码数字字符代码。

这是一个有符号的URL,因此使用urldecode($URL);更改签名。然后链接就失效了。谢谢,这很有道理。传递给控制器的(不正确)参数来自浏览器。我想最直接的解决办法是对变量进行编码、preg_替换和解码。
$data['filename'] = urldecode($url);
%26%2340%3B %26%2341%3B
 &  # 40 ;   &  # 41 ;