huacnlee / carrierwave-aliyun

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

含中文的文件名会上传失败 #39

Closed numbcoder closed 8 years ago

numbcoder commented 8 years ago

因为 carrierwave-aliyun 不支持设置 Content-Disposition 的,但是又想在下载的时候直接使用原文件名。 Carrierwave 默认 会过滤掉非拉丁字符的,按照官方的文档说法是,加上这一句,可以关闭过滤

CarrierWave::SanitizedFile.sanitize_regexp = /[^[:word:]\.\-\+]/

关闭过滤之后,文件名没问题,但是上传会失败,错误信息是:

Aliyun::Oss::RequestError (The request signature we calculated does not match the signature you provided. Check your key and signing method.)

我调试了一下发现,是 URI.encode(path) 导致的,如果不 encode 的话就没问题

numbcoder commented 8 years ago

https://github.com/aliyun-beta/aliyun-oss-ruby-sdk/issues/9

huacnlee commented 8 years ago

还是需要增加 Content-Disposition 的支持才是合理的

numbcoder commented 8 years ago

可以考虑支持在 uploader 里面设置 Content-Disposition

class AttachmentUploader < CarrierWave::Uploader::Base
  def content_disposition
    "attachment;filename=#{original_filename}"
  end
end

然后上传的时候读取 uploader 中的 content_disposition

或者更通用一点,加一个可以自定义上传 header 的方法,毕竟阿里云支持好几个参数可以设置 https://help.aliyun.com/document_detail/31978.html

numbcoder commented 8 years ago

经测试没问题! 什么时候发版本?

huacnlee commented 8 years ago

http://rubygems.org/gems/carrierwave-aliyun

numbcoder commented 8 years ago

SDK 建议更新到 > 0.1.8,刚刚修复了一个特殊字符计算签名的 bug

URI.encode(path) 这个 encode 应该要去掉,如果我上传的文件是 中文.pdf,那么实际上传上去的文件名变成了 %E4%B8%AD%E6%96%87.pdf,这个名字已经不对了

huacnlee commented 8 years ago

没有限制的,新安装的时候应该会用 SDK 的最新版本

lehug commented 6 years ago

@numbcoder sdk最新的就是0.1.8,没有更新的版本呀 @huacnlee 现在我的gemfile显示的sdk也是0.1.8.如上所述,如果我上传的文件是 中文.pdf,那么实际上传上去的文件名变成了 %E4%B8%AD%E6%96%87.pdf。接着访问时就无法访问了

huacnlee commented 6 years ago

看说明文档有讲这个事情的处理方式

lehug notifications@github.com于2018年4月11日 周三上午8:53写道:

@numbcoder https://github.com/numbcoder @huacnlee https://github.com/huacnlee 现在我的gemfile显示的sdk也是0.1.8.如上所述,如果我上传的文件是 中文.pdf,那么实际上传上去的文件名变成了 %E4%B8%AD%E6%96 https://maps.google.com/?q=E6%2596&entry=gmail&source=g%87.pdf 。接着访问时就无法访问了

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/huacnlee/carrierwave-aliyun/issues/39#issuecomment-380292206, or mute the thread https://github.com/notifications/unsubscribe-auth/AAAVjjkdMB5KSbNzyq5ZFItX64QBtMzwks5tnVQRgaJpZM4JfwF4 .

lehug commented 6 years ago

@huacnlee 对不起,举例有些不恰当,实际上我处理的是图片类文件,不是pdf文件。看到了关于增对文件设置 Content-Disposition的设置,但是不明白为何不针对于图片类文件,可否帮忙提供一些资料?

我现在有变相的解决这个问题:

感觉如上的处理方式不够优雅直接,有更好的处理方式吗?