• 两边都是 mount_uploader,我查了一下,里面存的也是一个文件名,没有任何变化。 但是,我重新存进去的可以用,原来数据导过来的就不工作,不知道还有些什么奇怪的信息,放在外面。

  • 版本差异太大了,4 年了,ruby 和 rails 的版本都升级了,原来的版本不一定能跑了。

  • 感觉是版本的问题,原来的版本 carrierwave 将信息存在 picture_filename 里面,现在好像默认是存在 picture 字段里面。 我做了复制,但是好像还是不对,依然读不出 url 来,是不是存进去的格式也发生了变化? 感觉原来存储的仅仅是一个文件名,而现在好像存储的是一个非常复杂的 json,直接吧原来的字符串赋值过去,搞不定啊。

  • 原来如此,还是比较有趣的。这种小点拨,还是非常有帮助的。

  • 非常感谢。准备尝试一下。 遇到个奇怪的问题,我的字段或函数中如果有下划线,就报错。 比如 image_url 字段,定义了,就无法使用。改成 imageurl,就对了。这是为什么啊?

  • 应该算是一个小 bug 吧。 考虑到效率问题,换成 vips 还是划算的。

  • 因为要使用 mongoid,所以不得不继续和 carrierwave 折腾。 我也想用 active_storage 啊。

  • 业余程序有能够对你有帮助,很欣慰。

  • 我没做这个测试,vips,通过 write_to_file 来保存文件,格式是跟着后缀变化的,具体格式方面,我也没有测试过。

    我看了一下代码: https://github.com/eltiare/carrierwave-vips/blob/master/lib/carrierwave/vips.rb

    def convert(extension)
      process :convert => extension
    end
    

    应该是实现了。

    我在我的代码中添加了

    process convert: 'png'
    

    执行了,没有问题。 但是,在 version 里面是错误的,程序在取 image.avatar.url 的时候会自动按照 version 相关的 url 去取 png,但其实图片是存成 jpg 了(原图是 jpg)。 然后改成了:

    version :thumb do
        process :scale => [150]
        process convert: 'png'
      end
    
      version :avatar do
        process :scale => [50]
        process convert: 'png'
      end
    

    就没有问题了。

  • 我已经搞明白了。 iterm 是不认翻墙的。 需要单独设置,比如重新设置 http_proxy 设置对了,就没有问题了。

  • 升级了最新的版本,问题解决了。 现在的问题是版本问题,如何将图片按分辨率,分版本上传上去,然后直接下载。 我上传了一张 20M 的照片,然后就悲剧了。

  • 当我添加了: config.active_storage.analyzers = [ ActiveStorage::Analyzer::QiniuImageAnalyzer, ActiveStorage::Analyzer::QiniuVideoAnalyzer ] 之后,显示 analyzers 失败。

    我很喜欢用 CarrierWave 里面的 remote_url,直接抓取外面的资源,现在怎么搞? 另外,原来 carrierwave 里面,是在上传的时候,做图像处理的,还可以添加水印、圆角什么的,现在怎么搞?是不是都要到显示的时候来处理?这样的话,是不是每次显示的时候都要运算,原来是分成不同的版本存下来的,显示的时候直接调用就好了。

    另外,询问一下,mongoid 上怎么用这个东西?CarrierWave 是有 mongoid 的整合 gem 的。

  • 我在使用 Active_Storage 的时候,遇到了一个奇怪问题。 这么多年来,一直都在使用七牛云,做了设置: storage.yml 里面

    qiniu:
        service: Qiniu
        access_key: <%= Rails.application.credentials.dig(:qiniu, :access_key) %>
        secret_key: <%= Rails.application.credentials.dig(:qiniu, :secret_key) %>
        bucket: <%= Rails.application.credentials.dig(:qiniu, :bucket) %>
        domain: <%= Rails.application.credentials.dig(:qiniu, :domain) %>
    

    development.rb 里面

    config.active_storage.service = :qiniu
    

    _form.html.erb 里面

    <%= form.file_field :image, direct_upload: true%>
    

    在上传文件的时候,却得到了这样的提示:

    NameError (Cannot load `Rails.config.active_storage.service`:
    uninitialized constant ActiveStorage::Service::QiniuService::Qiniu):
    

    使用 local 的时候,没有问题。 七牛的全套设置,是在其他项目里面一直在用的,肯定没有问题。

    请问我少设置了什么吗?

  • 做注释的时候,还没有找到正确的方法。在找到正确方法之后,就把注释取消了。

  • 调整了一下,解决了问题。 先在 application_controller.rb 里面把

    protect_from_forgery with: :exception
    

    注释掉,算是把逻辑调整完成了。

    然后在 js 里面加上了:

    axios.defaults.headers.common['X-CSRF-Token'] = document.getElementsByTagName("meta")[1].content;
    
    

    再恢复 application_controller.rb 里面的

    protect_from_forgery with: :exception
    

    工作正常。

    作为一个把写程序作为业余爱好的业余程序员,经常会遇到很多稀奇古怪的问题,在慢慢解决问题的过程中,寻找乐趣。

  • 是的,应该如何处理呢? 我没有办法取得 $('meta[name="csrf-token"]').attr('content')。 有什么方法可以获得独立的 token 吗?

  • 我原来用的是 ruby2.3 和 rails4.2.3

    新应用用的是 ruby2.4 和 rails5.1.2

    carrierwave-mongoid 0.10.0

  • 我创建了新的应用,将原来应用的 mongodb 数据库备份下来,还原到一个新的数据库上,然后建立了相同的 model,建立了相同的 carrierwave.rb 的配置文件,相同的 Uploader。

    却无法找到相关的文件。

    现在直接将新的应用指向了原来的数据库,依然没有办法找到相关的文件信息。

    不解啊。估计不是数据库的问题,应该是我的配置少了什么东西吧。

  • 感谢,我会去尝试一下。

  • 我已经用过了,还是挺好玩儿的。

  • Sidekiq 后台任务失效 at 2015年11月15日

    #16 楼 @qilinzou 总内存太少,再怎么折腾也是白费啊。

  • #2 楼 @rei 好来没有继续搞,我是个业余程序员。闲暇时间搞一搞。太复杂的就要放一放了。

  • Sidekiq 后台任务失效 at 2015年10月18日

    我现在遇到的最多的是内存分配失败。 特别是 carrierwave 中调用 minimagick 进行图片处理的时候。

  • Sidekiq 后台任务失效 at 2015年10月13日

    #10 楼 @zoker 你有多少内存?

  • #4 楼 @chareice #1 楼 @rei #6 楼 @saiga

    我现在使用七牛镜像了。不断是 assets 里面的文件,设置了这个值之后,所有图片都会自动转到七牛的域名,我现在准备加上一句:

    link_to(resource.title, Rails.application.config.action_controller.asset_host.to_s + resource.torrent_url, {:download => resource.torrent_filename, :onclick => 'ahoy.track("Download Torrent", {title: "' + resource.torrent_filename + '"});'})
    
    

    把所有东西都镜像上去,非常方便。

  • 我是将系统通过 docker 部署在了 digitalocean 中的一台只有 512M 内存的机器上,于是就经常会退出。 原来不适用 -d 参数,将 sidekiq 设置在一个独立的 docker 中时,没有这种问题。 但是用 -d 参数,将 sidekiq 和 webserver 跑在同一个 docker 中,就废掉了。

  • expire_fragment 好像无效了 at 2015年10月03日

    这个方法以前是可以工作的。 我重新尝试了:

    expire_fragment(%r{page\/[\s\S]*})
    expire_fragment('page\/[\s\S]*')
    

    依然无效。 是不是 cache 生成代码太复杂了? 上面那句话的意思,是我的 cache 可以通过 key 标示?

    <% cache [:page, "#{params[:page]||1}?#{params[:q]||''}", latest_page_update.to_s] do %>
    
  • Sidekiq 后台任务失效 at 2015年10月02日

    现在感觉,就是内存太少了。我把并行任务数设为 10,大概有一半的几率会崩掉。设为 20,每次都崩。最后改成了 5,天下太平了。

  • Sidekiq 后台任务失效 at 2015年09月30日

    #6 楼 @jimrokliu 我现在是定期检查,如果发现有计划任务过期,或执行任务堆积,就判定 sidekiq 退出了,就再起一次。