如题,在使用 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 之前先要生成管理凭证,然后带着这个凭证和上传的凭证进行先删除后添加?