从S3读取csv

时间:2019-02-02 16:42:05

标签: php amazon-s3 laravel-4

我有一个csv文件,该文件已在S3服务器中上传。我想知道我怎么可以加载或读取从S3?

下载的文件数据

代码

        $path = Input::get('filename');
        $s3 = new S3Client(Config::get('image'));
        $result = $s3->getObject(array(
            'Bucket' => Config::get('image.bucket'),
            'Key'    => Config::get('node.subdomain') . '/upload/' . $path,
        ));

        $r = fopen($result['Body'], 'a');

        Debugbar::addMessage($result,"download");

现在我得到failed to open stream: Invalid argument

2 个答案:

答案 0 :(得分:0)

您可以将文件保存在本地,然后使用以下内容阅读文件:

library(aws.s3)
library(tidyverse)

data <- 
  save_object("s3://myBucketName/directoryName/fileName.csv") %>%
  fread()

如果您不想用加载的每个csv的副本填充工作目录,那么这是一个更好的选择:

data <- 
  save_object("s3://myBucketName/directoryName/fileName.csv",
              file = tempfile(fileext = ".csv")
             ) %>%
  fread()

如果您对临时文件的位置感到好奇,那么Sys.getenv()可以提供一些见识-请参见TMPDIR TEMPTMP。可以在the Base R tempfile docs.中找到更多信息。

答案 1 :(得分:0)

有两部戏。

  1. 您的项目文件系统配置。
  2. 解析csv的行。

PROJECT / config / filesystems.php

<?php return [...
'disks' => [
...
    'myS3drive' => [
        'driver' => 's3',
        'key'    => env('AWS_ACCESS_KEY_ID'),
        'secret' => env('AWS_SECRET_ACCESS_KEY'),
        'region' => env('AWS_DEFAULT_REGION'),
        'bucket' => env('AWS_BUCKET'),
        ]
    ...]
...

然后,您可以在项目的其他地方使用类似的东西。

$csv = \Illuminate\Support\Facades\Storage::disk('s3')->get('myDataFile.csv');
foreach(preg_split("/((\r?\n)|(\r\n?))/", $csv) as $line){
    $data = str_getcsv($line);
    ...
}