13

用户正在上传名称为“abc #1”、“abc #2”的文件。我正在将这些文件上传到 S3。当我尝试下载这些文件时,我收到一个错误,比如这个 InvalidArgument Header 值包含一个开放的引用跨度。

我通过使用“Uri.EscapeUriString”包装文件名来创建链接。有什么建议么?

4

2 回答 2

6

来自AWS 文档

键的名称是 Unicode 字符序列,其 UTF-8 编码长度最多为 1024 个字节。

所以“abc #1”和“abc #2”是有效的键名,那么问题可能出在您的客户端代码中,请检查您的 Http 客户端的文档。

AWS 还警告使用特殊字符:

您可以在对象键名中使用任何 UTF-8 字符。但是,在键名中使用某些字符可能会导致某些应用程序和协议出现问题。以下指南可帮助您最大限度地遵守 DNS、Web 安全字符、XML 解析器和其他 API。

  • 字母数字字符:0-9, a-z,A-Z
  • 特殊字符:!, -, _, ., *, ', (,)

因此,要么将应用中的可用字符集限制为仅允许推荐的字符集,要么在客户端级别解决问题。

于 2019-04-27T12:12:44.987 回答
0

您应该使用Uri.EscapeDataString而不是Uri.EscapeUriString有 3 个原因:

  1. Uri.EscapeUriString自 .NET 6 起已弃用 - https://docs.microsoft.com/en-us/dotnet/api/system.uri.escapeuristring?view=net-6.0
  2. Uri.EscapeUriString在某些情况下可能会损坏 Uri 字符串
  3. Uri.EscapeUriString只转义空格 - 而不是#

Uri.EscapeUriString("abc #1")返回"abc%20#1",而Uri.EscapeDataString("abc #1")返回"abc%20%231"更可取。

于 2022-02-03T23:37:36.207 回答