我正在使用official PHP SDK和the official service provider for laravel将图片上传到Amazon S3。图像暂时存储在我的服务器上,上传后应删除。以下是我上传和删除时使用的代码。
$temp_path = "/screenshot_temp/testing.png";
$client = AWS::createClient('s3');
$result = $client->putObject(array(
'Bucket' => self::$bucketName,
'Key' => 'screenshot/testing.png',
'SourceFile' => $temp_path,
'ACL' => 'public-read'
));
);
chown($temp_path, 777);
unlink($temp_path);
上传成功。我可以通过链接返回看到我的图像,我可以在亚马逊控制台上看到它。问题是删除失败,并显示以下错误消息:
ErrorException: unlink(... path of my file ...): Permission denied
我确定我的文件权限设置是正确的,我可以删除我的文件,其中包含用于上传到S3注释的代码部分。所以应该是在上传文件期间文件被锁定的问题。有没有办法解锁和删除我的文件?
答案 0 :(得分:7)
是的,流上传会锁定文件直到完成,请尝试2,
$client = AWS::createClient('s3');
$fileContent = file_get_contents($temp_path);
$result = $client->putObject(array(
'Bucket' => self::$bucketName,
'Key' => 'screenshot/testing.png',
'Body' => $fileContent,
'ACL' => 'public-read'
));
);
unlink($temp_path);
或
$client = AWS::createClient('s3');
$fileContent = file_get_contents($temp_path);
$result = $client->putObject(array(
'Bucket' => self::$bucketName,
'Key' => 'screenshot/testing.png',
'Body' => $fileContent,
'ACL' => 'public-read'
));
);
gc_collect_cycles();
unlink($temp_path);
答案 1 :(得分:5)
当您在ws.myDomain.asuscomm.com
使用SourceFile
选项时,S3Client会打开一个文件,但在操作后不会将其关闭。
在大多数情况下,您可以取消设置putObject
和/或$client
以关闭已打开的文件。
但不幸的是不是这种情况。
使用$result
选项代替Body
。
SourceFile
答案 2 :(得分:1)
编辑:我刚注意到你的$ temp_path中的字符串以“/”斜杠字符开头。这个开头斜线通常从网站的根目录开始,你确定这是正确的位置吗?使用PHP中的getcwd()命令找出PHP认为它所在的文件夹。
我知道您认为权限是正确的,但鉴于“权限被拒绝”错误,我仍然相信它会告诉您相关的内容。
我看到你正在尝试chown目录,你是否意味着chmod它?如果您可以通过SSH连接到服务器并运行此命令,那么您可能会有更多的运气:
chmod -R 777 /(your-website-dir/screenshot_temp
甚至尝试在PHP代码中将“chown”更改为“chmod”。
答案 3 :(得分:1)
我不是一个PHP人,但是我会尝试将这个坏孩子放入流中,然后将流传递给SDK。
这样,您可以显式关闭流,然后删除临时文件。如果您的特定用例允许,您甚至可以完全删除临时文件并仅处理流。
看起来this SO post可能会让您走上正轨。