module Takenoko::AttachHelper
Public Instance Methods
upload_to_s3(table_data)
click to toggle source
# File lib/takenoko/s3/attach_helper.rb, line 4 def upload_to_s3(table_data) errors = [] return false unless table_data[:to_s3].present? raise 'bucket must be set' if table_data[:bucket].blank? raise 'attach_files empty' if table_data[:attach_files].blank? raise "Bucket not found:#{table_data[:bucket]}" unless bucket = Takenoko.s3.client.bucket(table_data[:bucket]) table_name = table_data[:table_name] takelog = "#{Takenoko.log_folder}/#{table_name}_log.yml" log_data = (File.exist?(takelog) && YAML.load_file(takelog)) || {} table_data[:attach_files].each do |col| next unless col[:to_s3].present? table_data[:rows].each do |row| next if row[col[:column_name]].blank? file_path = col[:download_location] + '/' + File.basename(row[col[:column_name]]) unless File.file?(file_path) errors << "Table[#{table_data[:table_name]}]File not found: #{file_path}" next end file = File.open(file_path) file_name = File.basename(row[col[:column_name]]) s3_path = col[:s3_folder]+ "/" + file_name # find_val = row[table_data[:find_column]] find_val = "#{col[:folder_id]}_#{file_name}" if log_data[find_val].present? && (f = bucket.files.get(s3_path)) if log_data[find_val][:s3_last_upload] && log_data[find_val][:s3_last_upload] >= file.mtime.to_i Rails.logger.info "Skip uploaded file: #{file_name}" next end end Rails.logger.info "Uploading to s3: #{file_path} -> #{s3_path}" f = bucket.files.create(Takenoko.s3.upload_options.merge({ key: s3_path, body: file, public: col[:s3_public], })) log_data[find_val] ||= {} log_data[find_val][:s3_last_upload] = file.mtime.to_i end end File.open(takelog, 'w') {|f| f.write log_data.to_yaml } raise errors.join("\n") unless errors.empty? return true end