如何在AWS S3 Helper上传文件后解锁文件?

时间:2016-12-30 11:07:01

标签: php laravel amazon-web-services amazon-s3 laravel-5

我正在使用official PHP SDKthe 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注释的代码部分。所以应该是在上传文件期间文件被锁定的问题。有没有办法解锁和删除我的文件?

4 个答案:

答案 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可能会让您走上正轨。