无AWS账号,如何获取带扩展名的AWS S3托管文件可用URL?
解决无扩展名S3文件通过WordPress API上传的问题
方案1:下载文件添加扩展名后上传
先通过curl把S3文件下载到本地,给文件加上正确的扩展名,再调用WordPress API上传。单文件操作示例:
# 下载文件并保存为对应扩展名的文件(这里从响应头拿到是Test.jpg) curl -o Test.jpg "https://s3-ap-southeast-2.amazonaws.com/abc-def-xyz/xxxxxx-xxxxxx-xxxxxx-xxxxxxxxx?versionId=xxxxxxxxxxxxx" # 调用WordPress媒体API上传,替换成你的站点地址和认证信息 curl -X POST -u "你的WP用户名:密码" -F "file=@Test.jpg" "https://你的WP站点域名/wp-json/wp/v2/media"
如果是大量文件,写个Shell脚本批量处理:遍历所有S3文件的URL,用curl -I解析响应头里的filename和Content-Type,自动命名保存后批量上传。
方案2:流式传输直接上传(无需本地保存)
不用把文件存到本地,直接将S3文件的数据流传给WordPress API,节省磁盘空间:
# 先获取文件流,再传给WP API,指定正确的文件名和MIME类型 curl -s "https://s3-ap-southeast-2.amazonaws.com/abc-def-xyz/xxxxxx-xxxxxx-xxxxxx-xxxxxxxxx?versionId=xxxxxxxxxxxxx" | curl -X POST -u "你的WP用户名:密码" -F "file=@-;filename=Test.jpg;type=image/jpeg" "https://你的WP站点域名/wp-json/wp/v2/media"
批量处理时,可以用脚本自动从每个S3 URL的响应头里提取filename和type参数,替换到命令里。
方案3:修改WordPress上传逻辑(需WP后台权限)
如果你能访问WordPress的主题或插件代码,可以修改上传校验逻辑,让WP自动根据文件的Content-Type补充扩展名。在主题的functions.php里添加以下代码:
add_filter('wp_check_filetype_and_ext', function($data, $file, $filename, $mimes) { // 当文件没有扩展名但能识别MIME类型时,自动映射扩展名 if (empty($data['ext']) && !empty($data['type'])) { $type_ext_map = [ 'image/jpeg' => 'jpg', 'image/png' => 'png', 'image/gif' => 'gif', 'application/pdf' => 'pdf', // 可根据需要添加更多类型映射 ]; if (isset($type_ext_map[$data['type']])) { $data['ext'] = $type_ext_map[$data['type']]; $data['proper_filename'] = $filename . '.' . $data['ext']; } } return $data; }, 10, 4);
添加后,WordPress会自动识别无扩展名文件的MIME类型并补充扩展名,直接上传原始S3文件的URL对应的数据流即可。
内容的提问来源于stack exchange,提问作者user1448031
相关产品推荐
相关产品推荐

