2016-03-10 75 views
0

我试着使用,以获得从S3存储文件getObject阅读从S3存储一个文件laravel得到错误

$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我得到的数据,身体的对象,流所有的东西,但不知道该怎么做。

回答

0

你能告诉我这些东西究竟等于什么吗?所以,我可以相应地引导你。

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

编辑

你的方法PARAMS应该是这样的,你刚好路过saveAs路径,但附加的键名,因此,添加keynamesaveAs路径,它将被下载。

$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', 
+0

Public_path()只是laravel项目的公用文件夹的路径。并且$ path-> path是s3桶的路径,这个文件位于这个桶中,在这种情况下它会得到/foldername/filename.xlsx –

+0

我更新了答案,只需在'public_path()'中添加'filename.xlsx'并检查你得到的文件或没有 – Qazi

+0

我忘了提及我也试过这种方式也给了我同样的错误 –

1

我已经想通了,有错误的AWS SDK, 我能得到通过在调用getObject之前在var中存储路径来保存文件

$r = fopen(public_path() . '/myfile.xlsx', 'wb'); 

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