Laravel 7.30.4中Storage::append合并分片文件失效问题排查
Laravel Storage::append 合并分片文件异常的原因及解决办法
问题出在Laravel的Storage::append()方法的默认行为上——它会自动在追加的内容末尾添加换行符(PHP_EOL),而原生file_put_contents(..., FILE_APPEND)不会做这个额外操作。如果你的分片文件是二进制类型(比如图片、视频、压缩包),或者不需要额外换行的文本文件,这个自动添加的换行符就会导致最终文件尾部出现多余内容,进而MD5哈希值不一致。
验证这个行为
查看Laravel 7.x版本的Illuminate/Filesystem/Filesystem.php中append方法的源码:
public function append($path, $data, $lock = false) { return file_put_contents($path, $data.PHP_EOL, $lock ? LOCK_EX : 0 | FILE_APPEND); }
可以看到,它在传入的$data后拼接了PHP_EOL,再调用file_put_contents。
解决办法
你可以绕过append方法,直接使用Laravel Storage的底层文件操作能力,模拟原生file_put_contents的行为:
方法1:使用Storage::put并传入FILE_APPEND参数
foreach($files as $file) { $content = Storage::get($file); Storage::put($tmp_file, $content, FILE_APPEND); }
Storage::put方法支持传入第三个参数作为文件操作标识,传入FILE_APPEND就能实现和原生方法一致的追加逻辑,不会额外添加换行符。
方法2:直接调用底层Filesystem的file_put_contents
如果需要更贴近原生写法,也可以直接用Filesystem实例:
use Illuminate\Support\Facades\File; foreach($files as $file) { $content = Storage::get($file); File::put(storage_path("app/{$tmp_file}"), $content, FILE_APPEND); }
这样处理后,合并出来的文件就会和原生方式生成的完全一致,MD5哈希值也会正确。
内容的提问来源于stack exchange,提问作者ZiTAL
相关产品推荐
相关产品推荐

