Laravel 5.5修改ImageMagick图片存储代码至AWS S3桶方法
把ImageMagick生成的图片上传到AWS S3(Laravel 5.5)
既然你已经搞定了Laravel的S3配置,接下来就很简单啦~我们可以直接用Laravel自带的Filesystem门面来处理上传,不用再直接操作本地路径了。下面给你两种实用方案:
方案1:直接上传二进制数据(推荐,更高效)
这种方式跳过本地存储步骤,直接把ImageMagick生成的图片二进制内容上传到S3,省掉磁盘IO的开销:
// 1. 获取ImageMagick生成的图片二进制数据 $imageContent = $imagick->getImageBlob(); // 2. 定义S3上的存储路径(和你之前本地的路径结构保持一致即可) $s3Path = 'files/' . $tempfoldername . '_' . $title . '/' . $title . '_page.jpg'; // 3. 用Laravel的Storage门面上传到S3 Storage::disk('s3')->put($s3Path, $imageContent, 'public'); // 注:如果你的图片需要公开访问,就加第三个参数'public';私有文件的话去掉这个参数就好
小说明:
getImageBlob()是Imagick自带的方法,能直接返回当前图片的二进制数据,完美适配Laravel的put方法。Storage::disk('s3')指定使用S3磁盘(如果你的配置里disk名称不是s3,记得改成你自己设置的名称)。
方案2:先存本地再上传(适合需要保留本地临时文件的场景)
如果你还是需要先在本地生成文件,再同步到S3,也可以这么操作:
// 1. 先按原来的逻辑写到本地 $localPath = storage_path('app/files/' . $tempfoldername . '_' . $title . '/' . $title . '_page.jpg'); $imagick->writeImages($localPath, false); // 2. 上传到S3 $s3Path = 'files/' . $tempfoldername . '_' . $title . '/' . $title . '_page.jpg'; Storage::disk('s3')->putFileAs('', $localPath, $s3Path, 'public'); // 3. 可选操作:如果不需要保留本地文件,上传完成后删除临时文件 unlink($localPath);
额外小贴士
- 上传成功后,要是需要获取图片的访问URL,公开文件可以用
Storage::disk('s3')->url($s3Path)来获取。 - 记得确认你的S3桶权限配置正确,Laravel使用的IAM用户要有
s3:PutObject这类必要的操作权限哦。
内容的提问来源于stack exchange,提问作者user779681
相关产品推荐
相关产品推荐

