从AWS Glacier下载文件时如何获取对应文件的扩展名?
解决方案
方案1:上传时存储元数据(推荐,准确率最高)
AWS Glacier 上传归档时支持传入ArchiveDescription自定义描述字段,你可以在上传阶段将原始文件的完整文件名(含扩展名)或者单独的扩展名存入该字段,后续下载时可直接读取该字段获取扩展名:
// 先调用describeJob接口获取归档描述信息 $jobDetail = $this->client->describeJob([ 'accountId' => config('aws.account_id'), 'jobId' => $job_id, 'vaultName' => config('aws.vault_name'), ]); // 解析描述信息获取扩展名 $archiveDesc = $jobDetail->get('ArchiveDescription'); $ext = pathinfo($archiveDesc, PATHINFO_EXTENSION) ?: 'mp4'; // 拼接文件名 $video_file_name = '/tmp/' . $archive_name . '.' . $ext;
方案2:检测流MIME类型映射扩展名(适合已存量归档无元数据的场景)
如果你的存量归档没有预先存储描述信息,可以通过PHP内置的fileinfo扩展读取流的头部信息判断文件MIME类型,再映射为对应扩展名,不需要完全写入文件即可完成检测:
$result = $this->client->getJobOutput([ 'accountId' => config('aws.account_id'), 'jobId' => $job_id, 'vaultName' => config('aws.vault_name'), ]); $stream = $result->get('body'); // 读取流前2KB内容判断MIME类型,足够覆盖视频文件的头部标识 $finfo = new Finfo(FILEINFO_MIME_TYPE); $mime = $finfo->buffer($stream->read(2048)); // 复位流指针,后续可正常写入完整文件 $stream->rewind(); // MIME类型和扩展名映射表,可根据你的归档实际格式扩展 $mimeExtMap = [ 'video/mp4' => 'mp4', 'video/quicktime' => 'mov', 'video/x-msvideo' => 'avi', 'video/x-matroska' => 'mkv', 'video/x-flv' => 'flv' ]; $ext = $mimeExtMap[$mime] ?? 'mp4'; // 后续文件写入逻辑 $video_file_path = public_path('/tmp/' . $archive_name . '.' . $ext); file_put_contents($video_file_path, $stream);
注意事项
- 方案2依赖PHP的
fileinfo扩展,绝大多数环境默认已开启,未开启时可在php.ini中启用extension=fileinfo即可 - 可根据自己归档的实际视频格式,扩展
$mimeExtMap映射表覆盖所有可能的文件类型
内容的提问来源于stack exchange,提问作者Anton Belyankin
相关产品推荐
相关产品推荐

