用户正在上传名称为“abc #1”、“abc #2”的文件。我正在将这些文件上传到 S3。当我尝试下载这些文件时,我收到一个错误,比如这个
InvalidArgument
Header 值包含一个开放的引用跨度。
我通过使用“Uri.EscapeUriString”包装文件名来创建链接。有什么建议么?
用户正在上传名称为“abc #1”、“abc #2”的文件。我正在将这些文件上传到 S3。当我尝试下载这些文件时,我收到一个错误,比如这个
InvalidArgument
Header 值包含一个开放的引用跨度。
我通过使用“Uri.EscapeUriString”包装文件名来创建链接。有什么建议么?
来自AWS 文档:
键的名称是 Unicode 字符序列,其 UTF-8 编码长度最多为 1024 个字节。
所以“abc #1”和“abc #2”是有效的键名,那么问题可能出在您的客户端代码中,请检查您的 Http 客户端的文档。
AWS 还警告使用特殊字符:
您可以在对象键名中使用任何 UTF-8 字符。但是,在键名中使用某些字符可能会导致某些应用程序和协议出现问题。以下指南可帮助您最大限度地遵守 DNS、Web 安全字符、XML 解析器和其他 API。
0-9
, a-z
,A-Z
!
, -
, _
, .
, *
, '
, (
,)
因此,要么将应用中的可用字符集限制为仅允许推荐的字符集,要么在客户端级别解决问题。
您应该使用Uri.EscapeDataString而不是Uri.EscapeUriString有 3 个原因:
Uri.EscapeUriString
自 .NET 6 起已弃用 - https://docs.microsoft.com/en-us/dotnet/api/system.uri.escapeuristring?view=net-6.0Uri.EscapeUriString
在某些情况下可能会损坏 Uri 字符串Uri.EscapeUriString
只转义空格 - 而不是#
Uri.EscapeUriString("abc #1")
返回"abc%20#1"
,而Uri.EscapeDataString("abc #1")
返回"abc%20%231"
更可取。