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

Php 检查Amazon s3签名URL上是否存在文件,php,curl,amazon-web-services,amazon-s3,Php,Curl,Amazon Web Services,Amazon S3,我已经为AmazonS3创建了一个签名的$URL,它可以在浏览器中完美地打开 http://testbucket.com.s3.amazonaws.com/100-game-play-intro-1.m4v?AWSAccessKeyId=AKIAJUAjhkhkjhMO73BF5Q&Expires=1378465934&Signature=ttmsAUDgJjCXepwEXvl8JdFu%2F60%3D **在本例中,Bucket name和accesskey发生了更改 但是,

我已经为AmazonS3创建了一个签名的$URL,它可以在浏览器中完美地打开

http://testbucket.com.s3.amazonaws.com/100-game-play-intro-1.m4v?AWSAccessKeyId=AKIAJUAjhkhkjhMO73BF5Q&Expires=1378465934&Signature=ttmsAUDgJjCXepwEXvl8JdFu%2F60%3D
**在本例中,Bucket name和accesskey发生了更改

但是,我尝试使用下面的函数检查(使用curl)文件是否存在。它使CURL连接失败。如果我将上面的$URL替换为s3之外的图像的URL,那么这段代码可以完美地工作

我知道该文件存在于amazon中,但是如果使用上面的签名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;

}
使用时,libcurl发送一个HTTP
HEAD
请求,而不是
GET
请求

…要签名的字符串由附加REST谓词、content-md5值、content-type值、expires参数值、规范化的x-amz头(请参见下面的配方)和资源组成;全部由换行符分隔

-

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


要以这种方式验证文件,您需要签署
请求,而不是
获取
请求。

您可以通过头部分进行检查

$full_url = 'https://www.example.com/image.jpg';
$file_headers = @get_headers($full_url);
if($file_headers && strpos($file_headers[0], '200 OK')){
    // enter code here
}
或者,如果您使用的是AWSS3,那么您也可以使用这个

if(!class_exists('S3')){
    require('../includes/s3/S3.php');
}
S3::setAuth(awsAccessKey, awsSecretKey);
$info = S3::getObjectInfo($bucketName, $s3_furl);
// check for $info value and apply your condition.

当我使用此代码检查s3上是否存在带有签名url的文件时,因为它是一个私有bucket(即没有公共策略)它总是失败,“connection failed”(连接失败)表示CURL连接本身失败。很抱歉,这可以通过AWS PHP SDK轻松解决,但我正在尝试在没有SDK的情况下让它工作,因为我正在将功能添加到wordpress插件中。谢谢你的回答。从我的研究看来,鉴于我不使用SDK的要求,这是正确的答案。话虽如此,我现在已经在插件中实现了SDK,因为它似乎是最健壮的解决方案,并提供了对我可能会使用的其他功能的访问。再次感谢。