如何在 Laravel 中从 S3 中读取 csv 文件?

4

我有一个已经上传到S3服务器的CSV文件。请问如何加载或读取从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");

现在我遇到了无效参数:打开流失败


fopen(path) 应该改为 fopen($path),我不确定您是否能够将内容追加到存储桶中,但我认为您要找的是 http://php.net/manual/en/function.fread.php。 - user3783243
我在阅读了AWS s3文档中有关如何从S3获取对象的内容后更新了我的代码。现在我已经从S3检索到了一个对象列表,但我不确定如何加载它。 - soyacincau
你得到的是一个对象,而不是流。尝试:$csv = (string) $result['Body']; 另外,如果你坚持要获取流,可以从S3客户端获取,找一下就行了。 - YvesLeBorg
@YvesLeBorg,您能提供一个从S3客户端获取流的示例吗?我认为这将是从S3获取大文件的解决方案之一。 - soyacincau
2个回答

1

这里有两个部分需要考虑:

  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);
    ...
}

-1
您可以将文件保存在本地,然后使用以下方法读取它们:
library(aws.s3) # to connect to s3 buckets
library(tidyverse) # for the pipes
library(data.table) # for the fread()

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。更多信息可以在Base R tempfile文档中找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接