gpt4 book ai didi

php - 无法使用图像的直接 URL 将图像上传到 S3 存储桶

转载 作者:行者123 更新时间:2023-12-01 15:00:30 25 4
gpt4 key购买 nike

这是我的代码,适用于表单上传(通过 $_FILES)(我省略了那部分代码,因为它不相关):

$file = "http://i.imgur.com/QLQjDpT.jpg";

$s3 = S3Client::factory(array(
'region' => $region,
'version' => $version
));

try {

$content_type = "image/" . $ext;

$to_send = array();

$to_send["SourceFile"] = $file;

$to_send["Bucket"] = $bucket;
$to_send["Key"] = $file_path;
$to_send["ACL"] = 'public-read';
$to_send["ContentType"] = $content_type;

// Upload a file.
$result = $s3->putObject($to_send);

正如我所说,如果文件是 $_FILES["files"]["tmp_name"] 则此方法有效,但如果 $file 是具有未捕获异常的有效图像 url 则失败 'Aws\Exception\CouldNotCreateChecksumException' with message '无法为提供的上传正文计算 sha256 校验和,因为它不可搜索。为防止此错误,您可以 1) 在您的请求中包含 ContentMD5 或 ContentSHA256 参数,2) 对正文使用可搜索流,或 3) 将不可搜索流包装在 GuzzleHttp\Psr7\CachingStream 对象中。但是您应该小心并记住 CachingStream 使用 PHP 临时流。这意味着流将暂时存储在本地磁盘上。'。有谁知道为什么会这样?什么可能关闭? Tyvm 为您提供帮助!

最佳答案

对于寻找选项 #3 (CachingStream) 的任何人,您可以向 PutObject 命令传递一个 Body 流而不是源文件。

use GuzzleHttp\Psr7\Stream;
use GuzzleHttp\Psr7\CachingStream;
...
$s3->putObject([
'Bucket' => $bucket,
'Key' => $file_path,
'Body' => new CachingStream(
new Stream(fopen($file, 'r'))
),
'ACL' => 'public-read',
'ContentType' => $content_type,
]);

或者,您可以只使用 guzzle 请求文件。

$client = new GuzzleHttp\Client();
$response = $client->get($file);

$s3->putObject([
'Bucket' => $bucket,
'Key' => $file_path,
'Body' => $response->getBody(),
'ACL' => 'public-read',
'ContentType' => $content_type,
]);

关于php - 无法使用图像的直接 URL 将图像上传到 S3 存储桶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34251296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com