Laravel 5.8用put方法从S3下载文件到本地报目录错误如何解决?
问题描述
我在已创建的目录中使用put方法将文件从s3下载到local磁盘时失败,报错如下:
ErrorException (E_WARNING) : file_put_contents(/path/storage/4804_1626): failed to open stream: Is a directory
经查对应目录已成功创建,我尝试在调用makeDirectory()方法时传入第三个参数设置权限为777,但问题仍然存在。目录权限信息如下:
ubuntu@ip:~/path/storage$ ll drwxr-xr-x 2 www-data www-data 4096 Sep 20 07:07 4804_1626/
相关代码与配置
$folderPath = Storage::disk('local')->makeDirectory($folderName, 0777); $contents = Storage::disk('s3')->get('path/' . $fileName); Storage::disk('local')->put($folderName, $contents); // 此行代码触发报错
问题原因
Storage::put()方法的第一个参数需要传入完整的目标文件路径(包含最终保存的文件名),你当前传入的是预先创建的目录路径$folderName,系统尝试将文件内容写入目录节点,直接触发报错。
你设置的777权限未生效不是本次报错的核心原因:Laravel 文件系统默认会按照配置的权限参数覆盖你传入的权限值,若需自定义目录权限可修改config/filesystems.php中对应磁盘的permission配置,或在目录创建后手动调用chmod修改。
修复代码
$folderPath = Storage::disk('local')->makeDirectory($folderName, 0777); $contents = Storage::disk('s3')->get('path/' . $fileName); // 拼接完整文件路径:目录路径 + 文件名 Storage::disk('local')->put($folderName . '/' . $fileName, $contents);
如果你需要更便捷的写入方式,也可以直接使用putFileAs方法,不需要预先读取文件内容。
内容的提问来源于stack exchange,提问作者Maqsud
相关产品推荐
相关产品推荐

