如何使用 Laravel 5.5 和干预图像将图像文件从 Amazon S3 上传到 Stripe

How to upload image file to Stripe from Amazon S3 using Laravel 5.5 and Intervention Image

Laravel 5.5 应用程序。我需要从 Amazon S3(已经工作)中检索驾驶执照的图像,然后使用他们的 api 将其上传到 Stripe 以进行身份​​验证(不工作)。

Stripe's documents举个例子:

\Stripe\Stripe::setApiKey(PLATFORM_SECRET_KEY);
\Stripe\FileUpload::create(
    array(
        "purpose" => "identity_document",
        "file" => fopen('/path/to/a/file.jpg', 'r')
    ),
    array("stripe_account" => CONNECTED_STRIPE_ACCOUNT_ID)
);

但是,我没有使用 fopen() 检索我的文件。 当我从 Amazon S3 检索图像时(使用我自己的自定义方法),我最终得到一个 Intervention\Image 的实例——本质上是 Image::make($imageFromS3)——我不知道如何将其转换为相当于对 fopen('/path/to/a/file.jpg', 'r') 的调用。我尝试了以下方法:

$image->stream()

$image->stream()->__toString()

$image->stream('data-url')

$image->stream('data-url')->__toString()

我也试过跳过干预图像,只使用 Laravel 的存储检索,例如:

$image = Storage::disk('s3')->get('path/to/file.jpg');

所有这些方法都会导致 Stripe 出现 Invalid hash 异常。

从 S3 获取文件并将其转换为等效于 fopen() 调用的正确方法是什么?

如果 S3 上的文件是 public,您可以将 URL 传递给 Stripe:

\Stripe\FileUpload::create(
    array(
        "purpose" => "identity_document",
        "file" => fopen(Storage::disk('s3')->url($file)),
    ),
    array("stripe_account" => CONNECTED_STRIPE_ACCOUNT_ID)
);

请注意,这需要在您的 php.ini 文件中启用 allow_url_fopen

如果没有,那么你可以先从S3抓取文件,写入一个临时文件,然后使用Stripe文档中提到的fopen()方法:

// Retrieve file from S3...
$image = Storage::disk('s3')->get($file);

// Create temporary file with image content...
$tmp = tmpfile();
fwrite($tmp, $image);

// Reset file pointer to first byte so that we can read from it from the beginning...
fseek($tmp, 0);

// Upload temporary file to S3...
\Stripe\FileUpload::create(
    array(
        "purpose" => "identity_document",
        "file" => $tmp
    ),
    array("stripe_account" => CONNECTED_STRIPE_ACCOUNT_ID)
);

// Close temporary file and remove it...
fclose($tmp);

有关详细信息,请参阅 https://secure.php.net/manual/en/function.tmpfile.php