我使用Amazon S3存储用户上传的照片,使用以下代码:
if(isset($_POST['Submit'])){
$fileName = $_FILES['theFile']['name'];
$fileTempName = $_FILES['theFile']['tmp_name'];
$folderName = "{id}/{address}/$fileName";
//create a new bucket
$s3->putBucket("bucket_name", S3::ACL_PUBLIC_READ);
//move the file
if ($s3->putObjectFile($fileTempName, "bucket_name", $folderName, S3::ACL_PUBLIC_READ)) {
echo ""; //etc, etc
{id}
和{address}
是动态变量,用于根据存储在mysql数据库中的每个用户的唯一数据,在上传文件时创建文件夹的外观。
我遇到的问题是在每个用户的密码保护站点中显示这些文件。我在下面使用的代码将所有用户的照片都显示出来并显示给所有用户。如果{id}/{address}/$fileName
转换为123/figuero/photo.jpg
,那么用户123
应该只能看到123/figuero/photo.jpg
(或包含前言123/
或123/xxx/
的任何其他文件
使用下面我使用的代码,所有用户都可以看到bucket_name
中的所有文件,而不仅仅是与其照片相关的动态数据相关的文件:
<ul>
<?php
$i = 0;
$contents = $s3->getBucket("bucket_name");
foreach($contents as $file)
{
$fname = $file['name'];
$furl = 'http://bucket_name.s3.amazonaws.com/'.$fname;
echo "<li><img src='$furl'></li>";
{
$i = 0;
}
}
?>
<ul>
换句话说, ALL 正在提取http://bucket_name.S3.amazonaws.com/内的文件以显示代码,而不仅仅是前面提到的文件中与用户123
相关的照片按123/xxx/
我错过了什么?非常感谢。
答案 0 :(得分:0)
我认为最好的方法是在存储桶名称上使用某种前缀来满足您的“目录”类型需求。除此之外,您需要在回显之前评估文件名中的目录名称。
List all Files in a S3 Directory with Zend Framework
即。使用存储桶名称来区分:
if(isset($_POST['Submit'])){
$fileName = $_FILES['theFile']['name'];
$fileTempName = $_FILES['theFile']['tmp_name'];
$folderName = "{id}/{address}/$fileName";
$bucketName = "bucket_name" . $folderName;
//create a new bucket
$s3->putBucket($bucketName, S3::ACL_PUBLIC_READ);
//move the file
if ($s3->putObjectFile($fileTempName, $bucketName, $folderName, S3::ACL_PUBLIC_READ)) {
echo ""; //etc, etc
和
<ul>
<?php
$i = 0;
$contents = $s3->getBucket($bucketName);
foreach($contents as $file)
{
$fname = $file['name'];
$furl = 'http://bucket_name.s3.amazonaws.com/'.$fname;
echo "<li><img src='$furl'></li>";
{
$i = 0;
}
}
?>
<ul>