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

AWS CLI上传文件至S3时对象键出现多余字符的问题咨询

问题:AWS S3上传文件后对象键出现多余字符,导致「Key not found」错误

我使用以下Shell脚本将文件上传至AWS S3存储桶:

#!/bin/sh
export AWS_ACCESS_KEY_ID="$KEY_ID"
export AWS_SECRET_ACCESS_KEY="$KEY_SECRET"
echo "[INFO] AWS_ACCESS_KEY_ID - $AWS_ACCESS_KEY_ID"
echo "[INFO] AWS_SECRET_ACCESS_KEY - $AWS_SECRET_ACCESS_KEY"
S3_URL="s3://mybucket/uploads"
aws s3 cp ../data.pdf $S3_URL/data.pdf
aws s3 cp ../data.html.zip $S3_URL/data.html.zip
echo "[INFO] Uploaded Successfully"
echo ""

执行脚本后文件成功上传,但在S3浏览器UI中发现对象键名称末尾出现了多余字符,这导致我的下载服务无法读取文件,出现「Key not found」错误。请问这些字符为何自动出现?如何消除该问题?


解答

我来帮你排查这个问题——S3对象键出现肉眼不可见的多余字符,通常是由隐藏字符、脚本格式或变量取值问题导致的,下面是最常见的原因和对应的解决办法:

1. 脚本使用了Windows换行符(CRLF)

如果你的脚本是在Windows系统下编辑的,然后放到Linux/macOS环境运行,脚本里的换行符会是CRLF(\r\n)而非Unix系统的LF(\n)。执行脚本时,\r字符(终端显示为^M)会被当作命令的一部分附加到文件名末尾,导致S3上的对象键变成data.pdf^M这类形式——肉眼看不到,但实际会让你的下载服务找不到对应键。

解决办法:

  • 用dos2unix工具转换脚本格式:
    dos2unix your-upload-script.sh
    
  • 或者在编辑器(比如VS Code)中,将文件的换行符设置为LF(编辑器右下角通常可以切换换行符格式),保存后重新运行脚本。

2. 环境变量或变量值包含隐藏空格/换行符

如果$KEY_ID、$KEY_SECRET或者S3_URL这些变量的取值里带有空格、换行符这类隐藏字符,拼接S3路径时就会引入多余内容。比如S3_URL定义时末尾不小心加了空格,或者从配置文件读取环境变量时带了换行。

解决办法:

  • 在脚本中添加一行打印变量的代码(用单引号包裹,能显式显示空格或换行):
    echo "S3_URL原始值: '$S3_URL'"
    
    执行脚本后查看输出,确认变量是否有多余字符。
  • 检查环境变量的来源(比如.env文件、命令行输入),确保取值没有额外的空格或换行。

3. 本地文件名本身带有隐藏字符

有可能你本地的data.pdf或data.html.zip文件名末尾实际带有空格、不可见ASCII字符,上传时这些字符会被同步到S3的对象键中。

解决办法:

  • 在本地终端用ls -b命令查看文件名的原始形式(-b参数会把不可见字符显示为转义序列):
    ls -b ../data.pdf
    
    如果发现有多余字符,重命名文件去掉这些内容后重新上传。

4. 验证最终执行的AWS命令

如果上面的方法还没找到问题,可以在脚本中临时添加一行,打印出实际执行的AWS命令,这样能直观看到是否有多余字符:

echo "执行的上传命令:aws s3 cp ../data.pdf $S3_URL/data.pdf"

执行脚本后看输出的命令是否异常,就能快速定位问题所在。


内容的提问来源于stack exchange,提问作者divinedragon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:49:04