【问题标题】:Changing cloudinary file default url per uploader更改每个上传者的 cloudinary 文件默认 URL
【发布时间】:2015-06-06 09:53:46
【问题描述】:

我有一个带有Ruby 2.2.0Rails 4 应用程序。

我正在构建一个需要存储大量图像的应用程序。目前该应用已存在,并且正在本地服务器上管理其图像,但我们想要改变这一点。

该应用目前部署在 Heroku 上,我们希望使用 Cloudinary 服务来上传(使用 carrierwave)新图像以及存储现有图像。

问题在于我似乎无法采用平台正在使用的当前文件夹结构。首先,我通过 cloudinary 仪表板中的媒体管理器上传了所有文件。我创建了两个文件夹headerlogo。在这种情况下,我将以header 文件夹为例。

class BannerUploader < CarrierWave::Uploader::Base
  include Cloudinary::CarrierWave

  def store_dir
    "uploads/header/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
end

型号:

class CompanyImage < ActiveRecord::Base

  mount_uploader :file_name, BannerUploader

  belongs_to :company
end

最后但并非最不重要的是,这是我的观点:

<%
  work_advantages = company.presentation.work_advantages
  banner = company.company_images.where(header: true).first
%>
<%= link_to company do %>
  <div class="card company-presentation-card card-hover">
    <div class="card-container">
      <div class="row">
        <div class="col-md-12">
          <div class="cover-image">
          </div>
          <h3><%= company.name %></h3>
          <% company.company_sectors.each do |s| %>
            <span class="h4-alt1 company-sector"><%= s.sector.name %></span>
          <% end %>
          <p><%= truncate(company.presentation.work_advantages, :length => 250) %> <span class="text-muted">(lees meer)</span></p>
        </div>
      </div>
    </div>
  </div>
<% end %>

<script>
  //Set dynamic background image for the cover-image <div>
  $(document).ready(function(){
    $('.company-presentation-card').find('.cover-image').css('background-image', 'url("<%= banner.file_name %>")')
  });
</script>

目前,正在传递的 url 如下:http://res.cloudinary.com/hxwmb9swy/image/upload/5a444a7c191e8c98999f6d0c2d3afaf9_Arendsen_Machinefabriek.jpg 但是我需要有 header(我在 Cloudinary 中创建的文件夹)文件夹,所以 url 实际上应该是这样的:http://res.cloudinary.com/hxwmb9swy/image/upload/header/5a444a7c191e8c98999f6d0c2d3afaf9_Arendsen_Machinefabriek.jpg

当然,在徽标的情况下,它完全相同,但是应该说 logo 而不是 header。这也适用于其他模型。所以我的问题是如何以某种方式管理它,以便我可以根据uploader 指定这个文件夹?欢迎任何想法。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 cloudinary


    【解决方案1】:

    headerlogo 应包含在图像的公共 ID 中。因此,如果您进行服务器端上传,您可以覆盖上传器中的 public_id 方法以包含该文件夹。例如,以下将公共 ID 设置为 header 文件夹和原始图像的文件名(不带扩展名,因为它应该):

    def public_id
        basename = File.basename(original_filename, File.extname(original_filename))
        "header/#{basename}"
    end
    

    如果您进行客户端上传,例如使用 Cloudinary 的 cl_image_upload,您可以执行以下操作:

    <%= f.cl_image_upload(:image, :folder => "header") %>
    

    对于第二种情况,无需更改上传器中的任何内容。

    【讨论】:

    • 这看起来很有趣。我会尽快进行测试,可能是明天,如果它解决了我的问题,我会告诉你。
    • 嘿,问题似乎仍然存在。如果我理解正确,我应该修改与标题或徽标相对应的上传者中的 Public_id 吗?我已经尝试将它放在标头上传器中,但是我在调​​用 file_name 时收到的链接仍然返回没有文件夹的 url。
    • P.S. public_id 的覆盖实际上有效。在 Rails 控制台中玩了一下,这是我设法找到的::003 &gt; c.company_images.first.file_name.public_id CompanyImage Load (0.6ms) SELECT "company_images".* FROM "company_images" WHERE "company_images"."company_id" = $1 ORDER BY "company_images"."id" ASC LIMIT 1 [["company_id", 23]] =&gt; "header/3559dff80c43e061d517870d3e997bf1_13b9719fdda733aa92e436c36542bd34_Rensa_VerwVentil_rgb"
    • 几个问题。 1-所以你从服务器端上传图片,对吧? 2-您希望公共 ID 的其余部分(在标题或徽标文件夹之后)是什么?它是您设置的公共 ID、原始文件名还是某种随机字符串?
    • 1 - 目前,我不想上传服务器端。我已经通过媒体管理器上传了我的文件,因为它是一个已经存在的平台,我们正在重建和迁移数据 => 所有当前用户都需要找到他们的图片。一旦平台启动并运行,用户当然可以上传图片。 2-目前文件名是随机字符串。由于旧平台的工作原理,我不太确定它们是如何生成的
    【解决方案2】:

    使用 CarrierWave 创建自定义名称文件夹 Cloudinary

    include Cloudinary::CarrierWave
    
    def public_id
     return "my_folder/" + Cloudinary::Utils.random_public_id;
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2013-07-29
      • 2014-08-17
      • 1970-01-01
      • 2023-03-23
      • 2019-09-20
      相关资源
      最近更新 更多