人生就是不斷學習,調整與更新持續前進。

Active Storage 上傳圖片裁切 v1

使用

require 'mini_magick'

gem 'mini_magick'

bundle install

 

以迴圈從form上傳為例,可以自己整合到service或其他地方,運用物件導向原理改良。


params[:file].each do |uploaded_file|
   next unless uploaded_file.is_a?(ActionDispatch::Http::UploadedFile)
   Rails.logger.info uploaded_file
      begin
          original_filename = uploaded_file.original_filename
          original_path = Rails.root.join('public', 'uploads', 'original', original_filename)
          FileUtils.mkdir_p(File.dirname(original_path))

          FileUtils.cp(uploaded_file.tempfile.path, original_path)
          puts "已保存原圖: #{original_path}"

          image = MiniMagick::Image.new(uploaded_file.tempfile.path)
          image.combine_options do |i|
            width, height = image[:width], image[:height]
            if width > height
              x_offset = [(width - height) / 2, 0].max
              i.crop "#{height}x#{height}+#{x_offset}+0"
            else
              y_offset = [(height - width) / 2, 0].max
              i.crop "#{width}x#{width}+0+#{y_offset}"
            end
            i.resize "300x300!"
          end

          cropped_filename = "cropped_#{uploaded_file.original_filename}"
          cropped_path = Rails.root.join('public', 'uploads', 'cropped', cropped_filename)
          FileUtils.mkdir_p(File.dirname(cropped_path))
          image.write(cropped_path)
          puts "Cropped and saved: #{cropped_path}"
      rescue => e
          Rails.logger.error "Error processing image: #{e.message}"
          puts "Error processing image: #{e.message}"
      end

end