检查Amazon s3签名URL上是否存在文件

Ste*_*ugh 5 php curl amazon-s3 amazon-web-services

我为Amazon s3创建了一个签名的$ URL,它在浏览器中完美打开.

http://testbucket.com.s3.amazonaws.com/100-game-play-intro-1.m4v?AWSAccessKeyId=AKIAJUAjhkhkjhMO73BF5Q&Expires=1378465934&Signature=ttmsAUDgJjCXepwEXvl8JdFu%2F60%3D
Run Code Online (Sandbox Code Playgroud)

**此示例中更改了存储桶名称和访问密钥

然而,我试图使用下面的函数来检查(使用curl)该文件是否存在.它未通过CURL连接.如果我用s3之外的图像的url替换上面的$ URL,那么这段代码可以完美地运行.

我知道该文件存在于亚马逊中,但如果使用如上所述的签名网址,则无法解决为什么此代码失败

有任何想法吗?

谢谢

这是我的代码.

function remoteFileExists($url) {

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, false);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    //don't fetch the actual file, only get header to check if file exists
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, true);

    $result = curl_exec($ch);
    curl_close($ch);



    if ($result !== false) {

        $statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);  

        if ($statusCode == 200) {
            $ret = true;   
        } else {
            $ret = false;
        }

    } else {
        $ret='connection failed';
    }

    return $ret;

}
Run Code Online (Sandbox Code Playgroud)

Mic*_*bot 5

使用CURLOPT_NOBODY时,libcurl 发送 HTTPHEAD请求,而不是GET请求。

\n
\n

...要签名的字符串是通过附加REST 动词、content-md5 值、content-type 值、过期参数值、规范化的 x-amz 标头(请参阅下面的配方)和资源形成的;全部由换行符分隔。

\n

\xe2\x80\x94 http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html

\n
\n

“REST 动词”(例如,GETvs HEAD)必须在您生成的签名和发出的请求之间保持一致,因此有效的签名GET将无效HEAD,反之亦然。

\n

您需要签署一个HEAD请求而不是一个GET请求才能以这种方式验证文件。

\n