【问题标题】:Laravel and AWS PHP SDK - Unable to delete a local file after it was uploaded to S3Laravel 和 AWS PHP SDK - 本地文件上传到 S3 后无法删除
【发布时间】:2015-11-29 19:43:40
【问题描述】:

我正在尝试在将文件上传到 AWS S3 后立即从本地目录中删除该文件。当我在 Vagrant 上运行它时,我得到一个错误 = Text-file:busy,当我在 xampp 上运行它时,我得到一个错误:permission denied。由于某种原因,AWS S3 PutObject 方法没有释放文件句柄。我尝试取消设置 s3 对象,但没有成功。

代码如下:

    $tempName = public_path().'/path/to/file'

    //Initialize AWS
    $s3 = AWS::createClient('s3');


    //Upload image to AWS

    try {
        $reponse = $s3->putObject(array(
            'Bucket'       => 'zotamoda',
            'Key'          => $productImage->image_folder."/".$productImage->image_name,
            'SourceFile'   => $tempName,
            'ACL'          => 'public-read',
        ));
    } catch (S3Exception $e) {
        // The AWS error code (e.g., )
        echo $e->getAwsErrorCode() . "\n";
        // The bucket couldn't be created
        echo $e->getMessage() . "\n";
    }


    //Delete image from temporary location
    unlink($tempName);

【问题讨论】:

  • 它非常依赖于操作系统,php 对行为几乎没有控制。即使您让它在您的开发框中工作,但这并不意味着它在您部署时也能工作。您最好不时使用临时文件或使用 cron 作业来删除它们。

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


【解决方案1】:

你可以试试:

Storage::disk('s3')->put($productImage->image_folder."/".$productImage->image_name, file_get_contents($tempName), 'public');
unlink($tempName);

或者,假设 $tempName 是相对于您的项目根目录的:

Storage::disk('local')->delete($tempName)

【讨论】:

  • 完美运行。谢谢。
【解决方案2】:

我认为你应该尝试调用:

gc_collect_cycles();

删除文件之前

【讨论】:

    猜你喜欢
    • 2017-06-24
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2018-07-03
    • 2017-01-16
    • 1970-01-01
    • 2016-04-07
    • 2016-08-22
    相关资源
    最近更新 更多