halo-dev / plugin-s3

为 Halo 提供 S3 对象存储协议的存储策略
https://halo.run/store/apps/app-Qxhpp
GNU General Public License v3.0
32 stars 20 forks source link

图片带有特殊符号上传后无法访问 #42

Open guqing opened 1 year ago

guqing commented 1 year ago

比如现有文件名 111F32F1B9D-中文 &%s/?.asdasd+123.jpeg 上传到 aliyun oss 后生成的 permalink 无法访问。 原因是其中的 + & :没有被 URL encode 而在 aliyun oss 那边是被 encode 了的导致结果不同而无法访问,UriUtils.encodePath 是不会 encode 这几个字符的

所以如果要解决这几个问题我想到两种可能:

  1. 直接使用 s3 平台上传后生成的访问链接以解决两边生成的不一致的问题
  2. 上传到 s3 前对文件名称进行处理去除掉特殊字符

/kind improvement

longjuan commented 1 year ago

平台生成的链接只有在CompleteMultipartUploadResponse中存在,在接口方法getPermalink中无法获取。 image image

longjuan commented 1 year ago

在接口方法getPermalink中无法获取。

或者设置一个Annotations可以实现。

guqing commented 1 year ago

或者设置一个Annotations可以实现。

上传完成之后将 oss 返回的访问链接存储到 annotations 中应该是可行的

longjuan commented 1 year ago

对于文件名为的文件:1(1)1$F3@2F1_B9D-中文 &%s.as^d!asd+123.png 腾讯云返回的路径:/test/1(1)1$F3@2F1_B9D-中文 &%s.as^d!asd+123.png 阿里云返回的路径:/test/1%281%291%24F3%402F1_B9D-%E4%B8%AD%E6%96%87%20%26%25s.as%5Ed%21asd%2B123.png 如果单纯采用厂商返回的路径,那么对于腾讯云这类厂商会发生错误,因为空格和百分号没转义导致链接错误和报错。 因此没办法保证所有厂商的链接都正确。

guqing commented 1 year ago

那看是否有必要在上传到oss时对文件名中的特殊字符进行过滤或编码