更改每个上传者的cloudinary文件默认url



我有一个带有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指定这个文件夹?欢迎提出任何想法。

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") %>

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

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

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

最新更新