简体   繁体   中英

How to get image capture date and video duration when uploading files using SWFUpload and Paperclip on Rails

I'm using SWFUpload and Paperclip on Rails 2.3.5 to upload images and videos. How can I store the capture date of images and duration of videos?

The following works correctly in irb:

irb(main):001:0> File.new('hatem.jpg').mtime
=> Tue Mar 09 16:56:38 +0200 2010

But when I try to use Paperclip's before_post_process:

before_post_process :get_file_info
def get_file_info
  puts File.new(self.media.to_file.path).mtime  # =>Wed Apr 14 18:36:22 +0200 2010
end

I get the current date instead of the capture date. How can I fix this? Also, how can I get the video duration and store it with the model?

Thank you.

It turns out that SWFUpload provides access to the file properties before uploading in the handlers.js file. So, to get the capture date:

//handlers.js    
function uploadStart(file) {
    // set the captured_at to the params
    swfu.removePostParam("captured_at");
    swfu.addPostParam("captured_at", file.modificationdate);
    ...
}

Now, you can receive it in the controller:

class UploadsController < ApplicationController
  def create
    @upload.captured_at = params[:captured_at].try :to_time
    ...
  end
end

To get the video duration, we have used Paperclip's before_post_process to run an FFmpeg command:

class Upload < ActiveRecord::Base
  before_post_process :get_video_duration

  def get_video_duration
    result = `ffmpeg -i #{self.media.to_file.path} 2>&1`
    if result =~ /Duration: ([\d][\d]:[\d][\d]:[\d][\d].[\d]+)/
      self.duration = $1.to_s
    end
    return true
  end
  ...
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM