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

cyt*_*nny 13 php amazon-s3 amazon-web-services laravel laravel-5

我正在使用正式的PHP SDKlaravel的官方服务提供商将图像上传到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);
Run Code Online (Sandbox Code Playgroud)

上传成功.我可以通过链接返回看到我的图像,我可以在亚马逊控制台上看到它.问题是删除失败,并显示以下错误消息:

ErrorException: unlink(... path of my file ...): Permission denied
Run Code Online (Sandbox Code Playgroud)

我确信我的文件权限设置是正确的,我可以删除我的文件与代码部分上传到S3注释.所以应该是在上传文件期间文件被锁定的问题.有没有办法解锁和删除我的文件?

Vin*_*esh 8

是的,流上传锁定文件,直到它完成,尝试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);
Run Code Online (Sandbox Code Playgroud)

要么

$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);
Run Code Online (Sandbox Code Playgroud)


Leo*_*kov 5

SourceFileputObjectS3Client上使用选项时,会打开一个文件,但在操作后不会关闭它。

在大多数情况下,您只能取消设置$client和/或$result关闭打开的文件。但不幸的是在这种情况下不是这样。

使用Body选项代替SourceFile

// temp file
$file = fopen($temp_path, "r");

// use resource, not a path
$result = $client->putObject(array(
        'Bucket'     => self::$bucketName,
        'Key'        => 'screenshot/testing.png',
        'Body'       => $file,
        'ACL'        => 'public-read'
    ));
);

fclose($file);

unlink($temp_path);
Run Code Online (Sandbox Code Playgroud)