我有一个Rails 4
应用Ruby 2.2.0
。
我正在构建一个应用程序,我需要存储相当多的图像。目前该应用程序存在并在本地服务器上管理其图像,但我们想要更改它。
该应用目前部署在Heroku上,我们希望使用Cloudinary
服务上传(使用carrierwave
)新图片以及存储现有图片。
问题来自于我似乎无法采用平台正在使用的当前文件夹结构。首先,我通过cloudinary仪表板中的媒体管理器上传了我的所有文件。我创建了两个文件夹header
和logo
。在这种情况下,我将引用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>
目前,正在传递的网址如下:http://res.cloudinary.com/hxwmb9swy/image/upload/5a444a7c191e8c98999f6d0c2d3afaf9_Arendsen_Machinefabriek.jpg
但是我需要有header
(我在Cloudinary中创建的文件夹)文件夹,所以网址应该看起来像这样:http://res.cloudinary.com/hxwmb9swy/image/upload/header/5a444a7c191e8c98999f6d0c2d3afaf9_Arendsen_Machinefabriek.jpg
当然,就徽标而言,它完全相同,而不是header
它应该说logo
。这也适用于其他型号。所以我的问题是如何以某种方式管理它,以便我可以按uploader
指定此文件夹?欢迎任何想法。
答案 0 :(得分:2)
header
或logo
应包含在图片的公开ID中。因此,如果您执行服务器端上载,则可以覆盖上传器中的public_id
方法以包含该文件夹。例如,以下内容将公共ID设置为header
文件夹,其中包含原始图像的文件名(没有扩展名,应该如此):
def public_id
basename = File.basename(original_filename, File.extname(original_filename))
"header/#{basename}"
end
如果您使用Cloudinary&#39; cl_image_upload
进行客户端上传,则可以执行以下操作:
<%= f.cl_image_upload(:image, :folder => "header") %>
对于第二种情况,您无需更改上传器中的任何内容。
答案 1 :(得分:0)
使用CarrierWave创建自定义名称文件夹Cloudinary
include Cloudinary::CarrierWave
def public_id
return "my_folder/" + Cloudinary::Utils.random_public_id;
end