首页 > 解决方案 > 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 %>

关于如何完成这项工作的任何想法?

标签: ruby-on-railscarrierwave

解决方案


推荐阅读