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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:27:03