2015-01-23 3 views
1

Я использую Carrierwave для загрузки изображений, документов и видео в мой ведро s3. Пока что загрузка изображений и документов в порядке.Обнаружение типа файла Rails

Что я хотел бы сделать на мой взгляд, это определить тип файла, а затем либо отобразить изображение (которое я могу сделать в настоящее время), либо предоставить изображение документа, который при нажатии будет загружать/открывать копию этого файл для пользователя.

Так на мой взгляд, чтобы сделать изображение я бы это сделать

<% document.each do |doc| %> 
    <%= link_to image_tag(doc.media_url(:thumb)) %> 
<% end %> 

Но как бы я идти о высказывании

<% document.each do |doc| %> 
    <% if doc.file_type == ['jpg', 'jpeg', 'png'] 
    <%= link_to image_tag(doc.media_url(:thumb)) %> 
    <% else %> 
    <%= link_to doc.media.path %> # This link downloading the file 
    <% end %> 
<% end %> 

Любая помощь приветствуется

Thanks

+0

можно обработать загруженный файл как файл в файловой системе? –

+0

извинения, но не могли бы вы объяснить немного дальше – Richlewis

ответ

2

Я думаю, (это не очень хорошая вещь, чтобы позволить другим людям угадать, что вы должны уже предоставили в вашем вопросе) у вас есть модель документа и ваш загрузчик является СМИ, что-то вроде этого:

class Document < ActiveRecord::Base 
    mount_uploader :media, MediaUploader 
end 

Если это так, для каждого документа вы получаете расширение (document.media.file.extension.downcase) и сравнить его с «JPG», «JPEG», «PNG»

<% document.each do |doc| %> 
    <% if ['jpg', 'jpeg', 'png'].include?(document.media.file.extension.downcase) %> 
    <%= link_to image_tag(doc.media_url(:thumb)) %> 
    <% else %> 
    <%= link_to doc.media.path %> # This link downloading the file 
    <% end %> 
<% end %> 

Carrierwave может дать вам тип содержимого, если вы хотите его с помощью:

document.media.content_type # this returns image/png for a png file ... 

Edit:

Я думаю, что лучший способ, чтобы проверить его, как это (он чище):

<% document.each do |doc| %> 
    <% if document.media.content_type =~ /image/ %> 
    <%= link_to image_tag(doc.media_url(:thumb)) %> 
    <% else %> 
    <%= link_to doc.media.path %> # This link downloading the file 
    <% end %> 
<% end %> 
+0

ах спасибо, это имеет больше смысла..следующий этап, позволяющий пользователю скачать документ :) – Richlewis

0

Ну , в linux я тоже верю в Mac, есть утилита для определения типа файла:

$ file filename.jpg 
filename: JPEG image data, JFIF standard 1.02 
$ file ./шрифты/шрифты/page-0020.png 
filename.png: PNG image, 2512 x 3270, 8-bit grayscale, non-interlaced 

так в ruby вы можете оформить %x() метод, чтобы получить информацию:

def type filename 
    res = %x(file "#{File.expand_path(filename)}") 
    m = res.match(/(.*): (.*)$/).to_a.last.split(' ').first.downcase 
end 

так он будет возвращать:

type "filename.jpg" # => jpeg 
type "filename.png" # => png 

Для окон некоторые люди должны использовать mingw/cygwin установок.

Смежные вопросы