laravel中使用http如何分块下载大文件
我想使用http服务(底层是guzzle)分块下载文件(文件比较大,不分块可能会出错),但是没有搜到guzzle如何分块下载
以下是下载代码:
// 下载
$response = Http::withoutVerifying()->get($service->getDownloadUrl($this->recording));
// 下载失败
if (!$response->ok()) {
return null;
}
// Log::info($response->header('content-disposition'));
// 存储文件
$file_path = 'tenant_' . tenant()->id . '/callcenter/' . date('Ymd') . '/' . Str::random(40) . '.wav';
Storage::disk($this->disk)->put($file_path, $response->body());
你好,可以自行实现,HTTP定义了分块下载的技术标准,只要服务端支持即可,可以给你说下大概思路流程:
第一步:发送
HEAD
类型的探测请求,如果响应报文存在请求头Accept-Ranges
的值为bytes
,说明服务端支持分块下载。第二步:分块下载,指定每个块的下载偏移量,例如:
curl -H "Range: bytes=0-1024" http://xxx.com -v
,Range: bytes=0-1024
的作用是,告诉服务器本次请求我们只想获取文件0-1024(包括1024)这块内容。 第三步:合并所有临时分块,如果之前服务端响应报文有文件hash(一些服务端的分块下载支持比较完善),则最好效验一下hash