PHP:获取文件扩展名无法上传到S3

前端之家收集整理的这篇文章主要介绍了PHP:获取文件扩展名无法上传到S3前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Amazon S3 API上传文件,每次上传时,我都在更改文件名称.

所以例如:

Dog.png> 3Sf5f.png

现在我得到了这样的随机部分:

function rand_string( $length ) {
            $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";  

            $size = strlen( $chars );
            for( $i = 0; $i < $length; $i++ ) {
                $str .= $chars[ rand( 0,$size - 1 ) ];
            }

            return $str;
        }

所以我将random_string设置为name参数:

$params->key = rand_string(5);

现在我的问题是这不会显示任何扩展.所以文件将以3Sf5f而不是3Sf5f.png上传.

变量$filename给出了具有扩展名的文件的全名.

如果我使用$params-> key = rand_string(5).’${filename}’;我得到:

3Sf5fDog.png

所以我试图检索$filename扩展名并应用它.
我尝试了30多种方法,没有任何积极的方法.

例如我试过$path_info(),我尝试了substr(strrchr($file_name,’.’),1);任何更多.他们都给了我3Sf5fDog.png或3Sf5f.

我尝试的一个例子:

// As @jcinacio pointed out. Change this to: 
//
//   $file_name = "${filename}";
//
$file_name = '${filename}'  // Is is wrong,since '..' does not evaluate 

$params->key = rand_string(5).$file_name;
=
3Sf5fDog.png

.

$file_name = substr(strrchr('${filename}','.'),1);

$params->key = rand_string(5).$file_name;
=
3Sf5f

.

$filename = "example.png"   // If I declare my own the filename it works.
$file_name = substr(strrchr('${filename}',1);

$params->key = rand_string(5).$file_name;
=
3Sf5f.png

整个类文件http://pastebin.com/QAwJphmW(没有其他文件为整个脚本).

我做错了什么?这真的令人沮丧.

变量$filename(因此“${filename}”)在代码行1053处不在范围内(基于来自pastebin的raw paste的行编号).

所以,无论你做什么,你永远不会找到不存在的变量的扩展名.

我终于弄清楚你在做什么.我认为这是PHP: Rename file before upload的延伸

简单的答案:你不能按照你的想法做到这一点.为什么’$filename’在URL被创建的时候没有解析,但是变量被传递给了Amazon S3并在那里处理.

解决方

所以,我想到的唯一选择是使用“successRedirect”参数来指向另一个URL.该网址将从Amazon(http://doc.s3.amazonaws.com/proposals/post.html#Dealing_with_Success)收到“bucket”和“key”作为查询参数.指向在Amazon S3上重命名文件(复制删除)的PHP脚本,然后将用户重定向到另一个成功屏幕.

所以,

在你的代码中,第34行,

>将一个完全限定的URL添加到您要进行的新的PHP脚本文件
写.
> PHP脚本将获取桶和密钥传递给它
>从“键”创建新的文件
>使用“public static function”函数
copyObject($srcBucket,$srcUri,$bucket,$uri)“复制上传
文件到新名称
>然后删除原始(使用deleteObject($bucket,$uri))
>然后将用户重定向到您要发送的位置

这将完成你想要的.

为了回应您的意见,“这是唯一的办法 – 亚马逊按要求收取的费用如何?”

删除请求是免费的.在同一桶(甚至在同一地区)移动时,无数据传输费用.所以这个解决方案(这是唯一的方式,没有你转移到中间服务器,重命名上传),将上传的成本从1c每1000次上传到2c / 1000次上传的两倍.我花了10分钟@ 200美元/小时找到那个回应= $33 = 1,666,666上传!当你做数学的时候,成本太小了:)

与其他解决方案进行比较:对网络服务器进行一次发布,重命名文件,然后从网络服务器上传:将所有带宽从定位点直接移动到自己 – 两次.这也引入了风险并增加了可能的故障点.

为了回应“不行,我上传一个文件,那旧的被删除

我会assusme这不是一个问题,因为你上传一个文件,然后重新命名它在一两秒钟内.但是,如果你想要每个文件都被上传,那么你需要做的不仅仅是创建一个随机文件名:

有你的“最后”桶>为每次上传,创建一个临时桶(这是每1000桶的1c,如果你担心成本)>上传到临时桶>创建随机名称,检查是否不存在最终的桶(每1000个检查1c)>将文件复制到最终的桶(用新名称)>删除上传文件以及存储桶.>定期清理文件上传未完成的存储区.

猜你在找的PHP相关文章