Php 在Laravel中读取S3中的csv?

Php 在Laravel中读取S3中的csv?,php,amazon-s3,laravel-4,Php,Amazon S3,Laravel 4,我有一个csv文件已经上传到S3服务器。我可以知道如何加载或读取从S3下载的文件数据吗 代码 现在我发现无法打开流:无效参数您可以在本地保存文件,然后使用以下命令将其读入: library(aws.s3) # to connect to s3 buckets library(tidyverse) # for the pipes library(data.table) # for the fread() data <- save_object("s3://myBucketN

我有一个csv文件已经上传到S3服务器。我可以知道如何加载或读取从S3下载的文件数据吗

代码


现在我发现
无法打开流:无效参数

您可以在本地保存文件,然后使用以下命令将其读入:

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()
library(aws.s3)#连接到s3存储桶
图书馆(tidyverse)#用于管道
库(data.table)#用于fread()
数据%
fread()
如果您不想用加载的每个csv的副本填充工作目录,那么这是一个更好的选择:

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

如果您对TEMP文件的位置感到好奇,那么
Sys.getenv()
可以提供一些见解-请参阅
TMPDIR
TEMP
TMP
。更多信息可以在中找到。

有两个方面在起作用

  • 您的项目文件系统配置
  • 解析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'),
            ]
        ...]
    ...
    

    fopen(路径
    应为
    fopen($path
    我不知道您是否能够将其附加到bucket中,但我想您需要的是,我在阅读了AWS s3文档后更新了我的代码,该文档介绍了如何从s3获取对象。现在我从s3检索了一个对象列表,但我不确定如何加载它。您获取的是对象,而不是流。请尝试:
    $csv=(字符串)$result['Body']
    ;…ps,您可以从S3客户端获取流,如果您坚持,请查找它。@YvesLeBorg您可以提供一个从S3客户端获取流的示例吗?我认为从S3获取更大文件将是一个解决方案。
    <?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);
        ...
    }