Gem carrierwave-qiniu 上传头像问题

naitnix · 2014年04月03日 · 最后由 glz1992 回复于 2016年02月03日 · 5393 次阅读

如题,在使用 carrierwave-qiniu 实现上传头像的时候发现一个问题,就是如果我第一次上传了一个头像,觉得不好,想再换一个新的时候,这个时候新上传的头像没法覆盖掉之前已经上传过的头像,这个时候七牛会返回一个资源已经存在的错误,看了下七牛的 api,在利用上传策略生成 upload_token 的时候,如果上传策略的 scope 值如果是单一的的话,表示允许用户上传文件到指定的 bucket。在这种模式下文件只能“新增”,若已存在同名资源则会失败。如果 scope 是 :形式则表示可以覆盖掉制定 key 的资源。

于是看了下 carrierwave-qiniu 的相关代码:

def store(file, key)
  token_opts = {
    :scope => @qiniu_bucket, :expires_in => 3600 # https://github.com/qiniu/ruby-sdk/pull/15
  }
  token_opts.merge!(:async_options => @qiniu_async_ops) if @qiniu_async_ops.size > 0

  uptoken = ::Qiniu::RS.generate_upload_token(token_opts)

  opts = {
    :uptoken            => uptoken,
    :file               => file.path,
    :key                => key,
    :bucket             => @qiniu_bucket,
    :mime_type          => file.content_type,
    :enable_crc32_check => true
  }

  ::Qiniu::RS.upload_file opts

end

可以看到这里的 scope 仅仅是获取了 bucket 并没有给用户自定义 scope 的可能,所以在用户上传头像的时候就会出现资源已存在的错误。

所以想问下大家,在使用这个 gem 的时候遇到类似的问题是怎么解决的,难道要我在每次 upload 之前先要生成管理凭证,然后带着这个凭证和上传的凭证进行先删除后添加?

@naitnix @gaoguoxin , 请更新版本至 0.0.9 在你的 Uploader 里添加

self.qiniu_can_overwrite = true

即可覆写文件,感谢您的关注。

#1 楼 @huobazi 你好 我想请问一下 我这边用的是 padrino + datamapper orm 我的 相关 gem 版本如下 carrierwave-qiniu (0.1.5) qiniu (~> 6.2.4) carrierwave (0.8.0) carrierwave-datamapper (0.2.2) 然后我在 初始化重新的时候 加上了 if defined? ::CarrierWave ::CarrierWave.configure do |config| config.storage = :qiniu config.qiniu_access_key = "_XXXXXX" config.qiniu_secret_key = _XXXXXX' config.qiniu_bucket = "_XXXXXX" config.qiniu_bucket_domain = "http://_XXXXXX._XXXXXX.z0._XXXXXX.clouddn.com/" # config.qiniu_bucket_private= true config.qiniu_can_overwrite = true end end

配置完后 我上传可以 当更新的时候 发现未能更改到,也就是楼主描述的问题 我在 uploader 文件 上传类中加入 self.qiniu_can_overwrite 也未能解决这个问题 麻烦你指点下 不胜感激

#2 楼 @mok

config.qiniucan_overwrite = true

-->

config.qiniu_can_overwrite= true

另外,你贴的那个代码比较老了,现在的是这样的

def store(file, key)
  overwrite_file = nil
  overwrite_file = key if @qiniu_can_overwrite

  put_policy = ::Qiniu::Auth::PutPolicy.new(
    @qiniu_bucket,
    overwrite_file,
    @qiniu_expires_in,
    nil
  )
  put_policy.persistent_ops = @qiniu_async_ops

  code, result, response_headers = ::Qiniu::Storage.upload_with_put_policy(
    put_policy,
    file.path,
    key
  )

在 config/initializers/carrierwave.rb 中设置了 config.qiniu_can_overwrite = true 覆盖了原来的图片,但是访问用户的头像地址 [http://example.qiniu.com/system/user/2015/1/1/3.jpg],显示的还是之前的头像。若是在地址的最后加上一串随机字符,就能显示最新上传的头像了。

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