所以例如:
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(没有其他文件为整个脚本).
我做错了什么?这真的令人沮丧.
所以,无论你做什么,你永远不会找到不存在的变量的扩展名.
我终于弄清楚你在做什么.我认为这是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)>将文件复制到最终的桶(用新名称)>删除上传的文件以及存储桶.>定期清理文件上传未完成的存储区.