huacnlee / carrierwave-aliyun

阿里云 OSS Ruby 上传组件,基于 Carrierwave
https://huacnlee.com/carrierwave-aliyun/
197 stars 93 forks source link

这前中文上传下载一直都没问题。今天发现不行 #45

Closed gogo52cn closed 7 years ago

gogo52cn commented 7 years ago

上传一个文件,model里用 model.file.url和到阿里云管理平台看到的url不一样。。。。

比如上传一个"比赛顺序“

model.file.url为:

***** %E6%AF%94%E8%B5%9B%E9%A1%BA%E5%BA%8F.pdf

而阿里的url是: ***** %25E6%25AF%2594%25E8%25B5%259B%25E9%25A1%25BA%25E5%25BA%258F.pdf

huacnlee commented 7 years ago

描述不清楚

此外,不要用中文作为文件名,避免出现奇怪的问题。

如果你希望用户下载的时候能获得中文文件名,你应该用 Content-Disposition 功能

https://github.com/huacnlee/carrierwave-aliyun#增对文件设置-content-disposition

gogo52cn commented 7 years ago

恩,好的,我正在改自己的代码用别的ASCII的文件名,然后在数据库里记录原始文件名。

我怀疑阿里改了他们的文件命名方法。。。 您的代码里是这样获得url的:

  def initialize(uploader, base, path)
    @uploader = uploader
    @path     = URI.encode(path)
    @base     = base
  end

  def url(opts = {})
    url = if @uploader.aliyun_private_read
      bucket.private_get_url(@path, opts)
    else
      bucket.path_to_url(@path, opts)
    end

    puts url
    url

  end

URI.encode('比赛顺序')为 %E6%AF%94%E8%B5%9B%E9%A1%BA%E5%BA%8F

而阿里现在的文件名是: %25E6%25AF%2594%25E8%25B5%259B%25E9%25A1%25BA%25E5%25BA%258F

我怀疑阿里改了他们命名文件的方法?

anyway, 我会保存一个普通英文数字的文件名避免这个问题。

谢谢华顺。

TangMonk commented 7 years ago

中文的确有问题, 用uuid了