You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:05:33