Rails rails carrierwave-qiniu

hrz3424 · 2014年09月05日 · 最后由 sunbird89629 回复于 2015年12月08日 · 6068 次阅读

rails carrierwave-qiniu 七牛的数据处理怎么配置 求助

  • 配置 API

  • Uploader

  • 图片上传


  • Model 中调用
mount_uploader :image, PhotoUploader

还是用 JS 直传快一点吧,走一遍服务器有意义么?

楼主 @hrz3424 是在说一楼 @mimosa 图 2 中 16 行 qiniu_async_ops 的配置吗?

#2 楼 @42thcoder 写在 model 里,因为不止在前台要用,其他后台场景中需要用~

#4 楼 @huobazi 你可以做到直接 Ajax 上传文件?浏览器一般是不允许通过 Ajax 直接上传文件的吧

#6 楼 @Martin91 这里说的是不经过自己的 web server 将文件直接传送到 qiniu 等云服务去。carrierwave 的默认实现是将文件传到 web server 上的,他的其他 的云存储的实现也基本是先传到 web server 然后在 web server 上调用 云服务的 api 传文件过去。

#7 楼 @huobazi 嗯嗯,这个明白,我之前也在用七牛的接口,只是我比较好奇你是怎么做到通过 Ajax 直传的而已,不过刚才拜读了你的代码之后,大概明白了其中的玄机了。 我自己的业务中,用户的附件使用表单直传,不过上传是同步的,完成后再跳转页面。另一边用户的头像这样的小文件,就是用的 carrierwave-qiniu 来上传到云服务器。

@huobazi 我想问下这个 qinu_async_ops 如何用?这个方法我看过源代码,但是如何使用他呢?如果一个 bucket 是 pirvate 的,你 override url 方法中调用的 super 方法得到的始终是已经生成好的 url(已经经过 qiniu.download_url 的处理了),这个时候再在这个已经生成好的 url 上处理恐怕是没有用的,如果用 carrierwave 的 version 方法也可以,但是会上传多张图片,怎么样才能使用 qiniu 的图片处理呢?

#9 楼 @nxbtch

qinu_async_ops 被老版的 qiniu-rs 这个 gem 支持,carrierwave-qiniu 0.1.1 开始使用 qiniu 这个 gem 了

可以暂时使用 carrierwave-qiniu 0.1.0 版本,后面会针对现在的 qiniu 这个 gem 的 persistentOps 参来开发这部分

示例:

def qiniu_async_ops commands = [] %W(small little middle large).each do |style| commands << "http://#{self.qiniu_bucket_domain}/#{self.store_dir}/#{self.filename}/#{style}" end commands end

需要事先在 qiniu 后台设置相应的 style 对应的 图片处理, 这个参数实际是告诉 qiniu 在上传后异步去做对应的文件处理

http://docs.qiniutek.com/v3/api/io/#uploadToken-asyncOps

@huobazi qiniu 的图片处理是异步的?我以为是如果你第一次访问会生成,然后后面的访问就会访问这张缓存的照片,我的想法是,在 carrierwave 原有的 version 模块上,再加个 qiniu_version, 调用的时候返回加有处理后缀的 url, 用法就和 version 一样。 class ImageUploader < Carrierwave::Base::Uploader qiniu_version :thumb, :medium, :big end

调用: a = ImageUploader.new a.thumb # "http://xxx.qiniudn.com/xxxx.png-thumb" a.medium # "http://xxx.qiniudn.com/xxxx.png-medium" a.big # "http://xxx.qiniudn.com/xxxx.png-big"

这样可以不用原有的 version,因为那样同一张照片会上传多次。上传的时候比较快些

#11 楼 @nxbtch qiniu 的图片第一次访问时也可生成的,其他较大的转换比较费时的处理可以异步处理

关于带 version 的 url 你说的这个就是拼个 url 么,何必那么麻烦呀

%W(small little middle large).each do |style|
   define_method("picture_#{style}_url".to_sym){ self.picture_url + "/#{style}" }
end

容易理解的版本

def avatar_url(size = nil)
  if avatar?
    return "#{avatar.url}/media" if size.nil?
    return "#{avatar.url}/#{size.to_s}"
  else
    return "http://xxxx.qiniudn.com/avatars/default-avatar.jpg/media" if size.nil?
    return "http://xxxx.qiniudn.com/avatars/default-avatar.jpg/#{size.to_s}"
  end
end

@huobazi 这种方法对公开的 bucket 的确有效,但我在项目中的是私有的 bucket, 如果调用 picture_url 返回的是已经 Qiniu.download_url 处理过的,后面已经带了 e 和 token 参数了,这个时候再在后面加任何东西都是无效的

如果 bucket 是 private 的,调用 url 方法得到如下 http://xxx.qiniudb.com/xxxx?e=xxxxx&toekn=xxxxx

按你的方法处理得到如下 url http://xxx.qiniudb.com/xxxx?e=xxxxx&toekn=xxxxx-thumb http://xxx.qiniudb.com/xxxx?e=xxxxx&toekn=xxxxx-medium http://xxx.qiniudb.com/xxxx?e=xxxxx&toekn=xxxxx-big

上面的都是无效的 qiniu 链接,正确的处理方法

原始链接: http://xxx.qiniudb.com/xxxx 加上处理参数: http://xxx.qiniudb.com/xxx-style 在通过 Qiniu.download_url 处理得到:http://xxx.qiniudn.com/xxx-style?e=xxxx&token=xxxxx 上面的就是有效的

#13 楼 @nxbtch

我感觉将 qiniu_versions 公开在 uploader 里做为一个数组,或者逗号分隔的字符串什么的,类似 qiniu_async_ops 这个参数,来让使用者复写。

然后在 gem 内 根据该参数的值 动态构造 url_version1 url_version2 url_version3 这样就可以和 carrierwave 自己缩略后创建的 url_versionxxxx 这样的 url 类似了

大概可这样

@qiniu_versions.each do |style|
   define_method("url_#{style}".to_sym){ self
.qiniu_connection.download_url("#{@path}#{delimiter}#{version}") }
end

@huobazi 恩,我改改看

手机上传图片到七牛上,会得到七牛的响应信息,里面包括一个 id 和一个 hash。然后手机端把这些信息传到服务器,服务器怎样做才能创建出来七牛的的 PhotoUploader 啊?

需要 登录 后方可回复, 如果你还没有账号请 注册新账号