通过laravel从s3存储桶读取文件时出现错误

时间:2016-03-10 02:40:28

标签: amazon-s3 laravel-5.2

我尝试使用getObject

从s3存储桶获取文件
 $s3 = AWS::createClient('s3');
        $file = $s3->getObject(array(
            'Bucket' => 'hotel4cast',
            'Key'    => $path->path,
            'SaveAs' => public_path()
        ));

我收到以下错误

执行错误

"GetObject" on "https://s3.amazonaws.com/mybucket/filename.xlsx"; 
AWS HTTP error: Unable to open /var/www/html/laravel/public/ using mode r+: fopen(/var/www/html/laravel/public/): 
ailed to open stream: Is a directory

如果我把SaveAs取出并转储$file我得到数据的对象,正文,流式传输所有这些东西,但不知道如何处理它。

2 个答案:

答案 0 :(得分:1)

我已经想到了,aws sdk中有bug, 我可以通过在调用getObject

之前在var中存储路径来获取要保存的文件
$r = fopen(public_path() . '/myfile.xlsx', 'wb');

$s3 = AWS::createClient('s3');
$file = $s3->getObject(array(
   'Bucket' => 'bucketname',
   'Key'    => $path->path,
   'SaveAs' => $r
));

答案 1 :(得分:0)

你能告诉我这些究竟是什么相等吗?所以,我可以相应地指导你。

$path->path = ???
public_path() = ???

<强>被修改

您的方法参数应该是这样的,您只需传递saveAs路径但附加密钥名称,因此,添加keyname saveAs路径,它将被下载。< / p>

 $s3 = AWS::createClient('s3');
        $file = $s3->getObject(array(
            'Bucket' => 'hotel4cast',
            'Key'    => $path->path,
            'SaveAs' => public_path()."/filename.xlsx"
        ));

以下是代码示例,我用它来上传文件和复制文件

上传

    $result = $this->S3->putObject([
        'ACL' => 'public-read-write',
        'Bucket' => 'xyz', // REQUIRED
        'Key' => 'file.xlsx', // REQUIRED
        'SourceFile' => public_path()."/xlsx/file.xlsx",
    ]);

用于从一个存储桶复制到另一个存储桶

    $copy   =   $this->S3->copyObject(array(
                      'ACL' => 'public-read-write',
                      'Bucket' => 'xyz', // REQUIRED
                      'Key' => 'file.xlsx', // REQUIRED
                      'CopySource' => 'mybucketname/xlsx/file.xlsx,
                ));       

但是您在s3存储桶中存在的文件应该具有读取权限。另外,它会给你错误saveAscopy

这里有多个权限,你可以在这里看到

'ACL' => 'private|public-read|public-read-write|authenticated-read|aws-exec-read|bucket-owner-read|bucket-owner-full-control',