Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
numbcoder opened this issue Aug 9, 2016 · 10 comments
Closed

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

numbcoder opened this issue Aug 9, 2016 · 10 comments

Comments

@numbcoder
Copy link

因为 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
Copy link
Author

@huacnlee
Copy link
Owner

huacnlee commented Aug 9, 2016

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

@numbcoder
Copy link
Author

可以考虑支持在 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
Copy link
Author

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

@huacnlee
Copy link
Owner

huacnlee commented Aug 9, 2016

@numbcoder
Copy link
Author

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

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

@huacnlee
Copy link
Owner

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

@lehug
Copy link

lehug commented Apr 11, 2018

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

@huacnlee
Copy link
Owner

huacnlee commented Apr 11, 2018 via email

@lehug
Copy link

lehug commented Apr 18, 2018

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

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

  • 增加文件名字段origin_filename
  • Uploader中增加filename方法,并在before :cache时,保存了origin_filename

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants