ruby-on-rails - Rails 使用carrierwave gem 上传视频和图片
问题描述
我正在使用它carrierwave gem
来上传视频和图像。一切正常,您可以看到图像和视频都已保存:
但是,当我将视频放在 a 中时,video_tag
我会在控制台中收到此错误,ActionController::RoutingError (No route matches [GET] "/uploads/attachment/media_files/8/SampleVideo_1280x720_1mb.mp4"):
并且以下视频无法播放。
相反,它应该能够播放视频并显示预览缩略图。
这是我的设置:
gem 'carrierwave'
gem 'carrierwave-video'
gem 'mime-types'
gem "rmagick"
gem 'carrierwave-video-thumbnailer'
gem 'mini_magick'
class AttachmentUploader < CarrierWave::Uploader::Base
after :store, :remove_original_file
def remove_original_file(p)
if self.version_name.nil?
self.file.delete if self.file.exists?
end
end
include CarrierWave::RMagick
include CarrierWave::Video
include CarrierWave::FFmpeg
include CarrierWave::Video::Thumbnailer
def set_content_type
model.content_type = content_type
end
storage :file
def store_dir
"uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end
process :set_content_type
def auto_orient
manipulate! do |img|
img = img.auto_orient
end
end
def size_range
0..15.megabytes
end
version :video, :if => :video? do
process :encode
process encode_video: [:mp4, callbacks: { after_transcode: :set_success } ]
end
version :thumb do
process thumbnail: [{format: 'jpg', quality: 8, size: 360, logger: Rails.logger}]
def full_filename for_file
jpg_name for_file, version_name
end
end
version :medium do
process thumbnail: [{format: 'jpg', quality: 85, size: 300, logger: Rails.logger}]
def full_filename for_file
jpg_name for_file, version_name
end
end
version :thumb_image,:if => :image? do
process :auto_orient
process :resize_to_fit => [640, 400]
end
version :mini_image,:if => :image? do
process :auto_orient
process :resize_to_fit => [100, 100]
end
def jpg_name for_file, version_name
%Q{#{version_name}_#{for_file.chomp(File.extname(for_file))}.jpg}
end
def encode
video = FFMPEG::Movie.new(@file.path)
video_transcode = video.transcode(@file.path)
end
def extension_whitelist
%w(mp4 jpg jpeg gif png)
end
protected
def image?(new_file)
new_file.content_type.include? 'image'
end
def video?(new_file)
new_file.content_type.include? 'video'
end
end
附件型号:
mount_uploader :media_files, AttachmentUploader
这就是我在视图中获取文件的方式:
<% unless @attachments.blank? %>
<% @attachments.each do |attachment| %>
<%= image_tag attachment.media_files_url(:mini_image).to_s if attachment.content_type == 'image/jpeg' %>
<%= video_tag attachment.media_files_url(:video).to_s, :controls => true if attachment.content_type == 'video/mp4' %>
<% end %>
<% end %>
关于如何完成这项工作的任何想法?
解决方案
推荐阅读
- spring-boot - 无法在 springboot application.properties 中填充系统环境值
- html - HTML标签内的div?(引导程序 4)
- python - 无法选择下拉菜单:Kendo UI + AngularJS、Selenium、Python
- java - 是否可以在自定义组件中使用骆驼组件?
- javascript - 我可以简化这些 JavaScript 三元运算符吗?`变量A?variableB : false` 到 `variableA && variableB`
- c# - 作为 ComboBox 源的字典以 InvalidCastException 结尾
- google-cloud-platform - 可以将现有 GKE 集群设为私有吗?
- google-bigquery - BigQuery BI 引擎是否支持左连接?
- java - 使用比较器时相同类型的不兼容类型错误
- go - 如何在 Golang 中使用 gofpdi.importPage() 导入下载的空白 pdf 文件?