我为Amazons3创建了一个签名的$URL,它在浏览器中完美打开。
http://testbucket.com.s3.amazonaws.com/100-game-play-intro-1.m4v?AWSAccessKeyId=AKIAJUAjhkhkjhMO73BF5Q&Expires=1378465934&Signature=ttmsAUDgJjCXepwEXvl8JdFu%2F60%3D
**在本例中,存储桶名称和访问密钥发生了更改
然而,我尝试使用下面的函数来检查(使用curl)该文件是否存在。它使CURL连接失败。如果我用s3之外的图像的URL替换上面的$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;
}
使用CURLOPT_NOBODY时,libcurl发送一个HTTP HEAD
请求,而不是GET
请求。
要签名的字符串是通过附加REST谓词、content-md5值、内容类型值、过期参数值、规范化的x-amz头(见下面的配方)和资源而形成的;全部用换行符分隔。
--http://s3.amazonaws.com/doc/s3-developer-guide/RESTAuthentication.html
";REST动词"--例如,GET
与HEAD
——生成的签名和发出的请求之间必须一致,因此对GET
有效的签名对HEAD
无效,反之亦然。
您需要签署HEAD
请求而不是GET
请求,才能以这种方式验证文件。
您可以通过表头部分进行检查。
$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
}
或者,如果你使用的是AWS S3,那么你也可以使用这个。
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.