使用 Carrierwave 和 rmagick 上传到 s3 的 exif 图像旋转问题

2024-03-13

我的 Rails 应用程序中有照片上传功能。该应用程序通过 rmagick 和雾通过 Carrierwave 直接上传到 s3。我遇到的问题是,当通过手机通过肖像中的“拍照选项”上传照片时(注意这是 iPhone 上的,但我相信 Android 也有同样的问题)。上传后,图像在移动设备上显示正常,但在桌面上查看时,图像会旋转 90 度。

通过我的研究,这似乎是 exif 的问题。这堆栈溢出响应者 https://stackoverflow.com/a/1051177/2066855概述了 2 个潜在的解决方案。这gist https://gist.github.com/jcsrb/1510601看起来也很有希望。

到目前为止,我发现了一些已发布的解决方案,但没有一个有效。理想情况下,我希望将照片作为肖像保存到 s3,然后按原样显示图像。

如有任何建议,我们将不胜感激。

下面是我的代码

应用程序/上传器/image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
  include CarrierWaveDirect::Uploader

  include CarrierWave::RMagick

  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
  include Sprockets::Helpers::RailsHelper
  include Sprockets::Helpers::IsolatedHelper

  include CarrierWave::MimeTypes
  process :fix_exif_rotation
  process :set_content_type


  version :thumb do
    process resize_to_fill: [200, 200]
  end

  def extension_white_list
    %w(jpg jpeg png)
  end


  def fix_exif_rotation #this is my attempted solution
    manipulate! do |img|
      img = img.auto_orient!
    end
  end


end

应用程序/模型/s3_image.rb

class S3Image < ActiveRecord::Base
  attr_accessible :image, :name, :user_id
  mount_uploader :image, ImageUploader

  belongs_to :user


  def image_name
    File.basename(image.path || image.filename) if image
  end


  class ImageWorker
    include Sidekiq::Worker

    def perform(id, key)
      s3_image = S3Image.find(id)
      s3_image.key = key
      s3_image.remote_image_url = s3_image.image.direct_fog_url(with_path: true)
      s3_image.save!
      s3_image.update_column(:image_processed, true)
    end
  end
end

配置/初始化器/Carrierwave.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: "AWS",
    aws_access_key_id: " ... ",
    aws_secret_access_key: " ... "
  }
  config.fog_directory = " ... "
end

顺便说一句我用过这个铁路广播公司 http://railscasts.com/episodes/383-uploading-to-amazon-s3作为设置我的 s3 上传的指南。


好吧,我使用雾或 Carrierwave_direct 来完成这项工作。

下面是最终为我工作的代码:

应用程序/上传器/image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
   include CarrierWave::MiniMagick

   include Sprockets::Helpers::RailsHelper
   include Sprockets::Helpers::IsolatedHelper

   storage :fog

  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end


  def fix_exif_rotation #this is my attempted solution
    manipulate! do |img|
      img.tap(&:auto_orient)
    end
  end

  process :fix_exif_rotation
end

应用程序/模型/s3_image.rb

class S3Image < ActiveRecord::Base
  attr_accessible :image, :name, :user_id, :image_cache
  mount_uploader :image, ImageUploader

  belongs_to :user
end

初始化器/carrierwave.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: "AWS",
    aws_access_key_id: " ... ",
    aws_secret_access_key: " ... ",
    region: 'us-west-2'
  }
  config.fog_directory = " ... "
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Carrierwave 和 rmagick 上传到 s3 的 exif 图像旋转问题 的相关文章

  • Rails 返回 JSON 序列化属性 with_in Different_access

    我以前有 serialize params JSON 但这会返回 JSON 并将哈希键符号转换为字符串 我想使用符号引用哈希 这在使用哈希时最常见 我向它提供符号 Rails 返回字符串 为了避免这种情况 我创建了自己的 getter se
  • 如何在 Haml 中编写 if 条件?

    怎么写if and if elseRuby on Rails 应用程序的 Haml 语句 HAML 是基于缩进的 解析器可能很棘手 在 Haml 中不需要使用 end 请改用缩进 在 Haml 中 只要在 Ruby 计算命令之后增加缩进 就
  • 将文件从 url 上传到 s3 存储桶

    我有一个在 Heroku 中运行的 Nodejs 程序 它为我提供了文件的 URL 这些文件需要存储在 s3 存储桶中 据我了解 无法将文件从 url 直接上传到 s3 存储桶 您建议我如何将文件从 URL 获取到 s3 存储桶 我见过有关
  • 部署到 Heroku 时使用 Rails Secrets.yml 且无需将密钥暴露给公共存储库的分步说明

    我正在使用 Rails 4 1 1 和 ruby 2 0 0 我目前已经忽略了 github 的 gitignore 中的 Secrets yml 文件 秘密 yml development secret key base numb3r57
  • 回形针如何更改基本名称(文件名)?

    我正在尝试更改照片的基本名称 文件名 在我的模型中我有 attr accessor image url basename has attached file image styles gt original gt 300x250 gt pn
  • 在代码中的其他地方设计渲染符号=>向上/形式部分

    我刚刚开始使用 Devise 和 Rails3 我已经完成了身份验证并正在工作并了解基础知识 截至目前 在代表我的主页 首页的主控制器中 我有两个链接 一个链接到 注册 gt sign up 另一个链接根据登录 注销 gt sign in
  • 如何使用 RSpec 检查 JSON 响应?

    我的控制器中有以下代码 format json render json gt flashcard gt flashcard lesson gt lesson success gt true 在我的 RSpec 控制器测试中 我想验证特定场景
  • ruby on Rails,会话过期通知

    我正在使用 ruby 1 9 3 和 Rails 3 2 我的实际会话处理如下所示 会话助手 def sign in user cookies remember token value user remember token expires
  • Rails:渲染不起作用,仍然出现“模板丢失”

    我目前正在学习 Rails 指南 我完成了这些步骤 但仍然遇到错误 我的 Ruby 版本是ruby 2 1 1p76Rails 版本是4 0 4 按照指南的指示 我创建了一个Article Controller class Articles
  • Eventmachine start_tcp_server 无接受器 - 端口正在使用或需要 root 权限(运行时错误)

    我已经 3 天无法运行本地服务器了 重新启动我的计算机没有帮助 有几次 在反复尝试大约 40 50 次之后 它随机地起作用了 我不明白为什么 我尝试过一次不同的端口并且有效 但从那以后 没有端口有效 每次我尝试运行我的 Rails 服务器时
  • 错误“未初始化常量 AWS (NameError)”

    它说 AWS 未初始化 我正在使用 aws sdk core gem 我尝试使用 aws sdk gem 代替 问题仍然存在 这是initializers aws rb 文件 AWS config access key id gt ENV
  • Rails 3 - “无法解析 Yaml”

    我不知道我做错了什么 我尝试运行 rails c 但它只是给了我一个错误 10 分钟前它还在工作 C Ruby192 lib ruby 1 9 1 psych rb 148 in parse couldn t parse YAML at l
  • 设备注册控制器获取零资源的自定义操作

    基本上我想要有两个单独的操作来更改密码和更改电子邮件 而不是只有一个 我已经更新了我的路由以指向继承自 Devise RegistrationsController 的新控制器 我的路线 rb devise for users contro
  • 为什么从浏览器上传到 S3 时出现 403 错误?

    因此 我尝试查看此处之前的答案 但似乎没有任何效果 我正在使用 Dropzone 它似乎发出 OPTIONS 请求来获取所有允许的 CORS 相关信息 但它似乎没有正确返回 因此 通过查看 Chrome 开发工具 我有以下请求标头 Host
  • Twitter Bootstrap 中下拉链接的模态

    我正在尝试从下拉菜单中的链接进行模式启动 该模式似乎已启动 网站变为灰色 但看不到 来自不在下拉列表中的常规链接的模态工作得很好 我对 jquery 进行了愚弄 但由于我是 jquery 的新手 所以没有任何结果 这是我的网站代码
  • 带有附加参数的redirect_to

    我是一个菜鸟 redirect to users url notice Succeed p p 然后我添加一个message它失败了 redirect to users url notice Succeed message test p p
  • Ruby on Rails 3 - 为每个请求重新加载 lib 目录

    我正在为 Rails 3 应用程序创建一个新引擎 正如您所猜测的 该引擎位于我的应用程序的 lib 目录中 但是 我在开发它时遇到了一些问题 事实上 每次更改引擎中的某些内容时 我都需要重新启动服务器 有办法避免这种情况吗 我可以强制rai
  • save_and_open_page 已停止提供我的 CSS

    我的测试设置工作得很好 每当我打电话时 都能提供正确格式的 css 页面save and open page从测试中 然后 我设置了一些 javascript 测试 并对我的设置进行了一些更改 抱歉 我无法详细说明所有内容 我没有足够详细地
  • 在特定页面上执行 javascript 的正确“Rails”方式

    我试图在特定页面上运行 javascript 而我唯一的解决方案似乎是反模式 我有controller js内部生成的assets javascripts 我在用着gem jquery turbolinks 我的代码类似于以下内容 docu
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样

随机推荐

  • 如何正确编写异步方法?

    所以我试图学习在 C 中使用 async 和 await 的基础知识 但我不确定我在这里做错了什么 我期待以下输出 Calling DoDownload DoDownload done output here 但我没有得到下载的输出 我也期
  • 使用 Ionic 框架生成 PDF 文件

    Ionic 框架是否有任何插件可以使用 html 内容生成 pdf 文件 基本上 我需要使用从 Ionic 移动应用程序传递的值和一些 css 样式创建一个 html 然后将其转换为 pdf 文件 该文件可以保存在设备 Android 设备
  • 多人游戏同步

    我实现了服务器 客户端架构 其中所有状态更改都发送到函数 经过验证并广播到所有连接的客户端 这工作得相当好 但系统目前无法维持游戏客户端实例之间的同步 如果服务器和特定客户端之间恰好有 5 秒的延迟 那么他将在其他客户端之后 5 秒收到状态
  • 在 MATLAB 中从一维数组生成二维数组

    有谁知道是否有一种方法可以从 1D 数组生成 2D 数组 其中 2D 中的行是通过重复 1D 数组中的相应元素生成的 I e 1D array 2D array 1 1 1 1 1 1 2 2 2 2 2 2 3 gt 3 3 3 3 3
  • 是否可以对分块数据使用 DictVectorizer?

    我正在尝试使用 python pandas csv reader 导入分块数据 以克服内存错误 并使用 DicVectorizer 将字符串转换为浮点数据类型 但我可以看到两个不同的字符串在转换后具有相同的代码 我们是否有替代 选项来对分块
  • 如果父节点值匹配,则将相应父节点的所有子节点合并到第一个父节点下

    嗨 我的输入是这样的
  • 如何在 Linq To SQL 中为连接设置 ARITHABORT ON

    默认情况下 对于 OLEDB 连接 SQL 连接选项 ARITHABORT 为 OFF 我假设 Linq To SQL 正在使用该连接 不过我需要它处于开启状态 原因是我的数据库包含一些索引视图 如果连接没有启用 ARITHABORT 则对
  • 从一个原始整数列表生成打乱整数列表的算法

    有一个 ArrayList 为x unique Integers 我需要将它们随机分配y数组列表z尺寸 请记住 x y z是变量值 结果数组中的数字不能重复 结果列表不能包含相同的数字 订购它们必须不同 如果计算结果数组中的出现次数 则原始
  • 来自字符串的 PHP 变量值

    如何从字符串变量中获取值 Member Student 3600 selectedItem Member Student price selectedItem print r price prints Member Student inst
  • Python Sympy 求解返回列表与字典

    我正在使用 sympy 及其求解函数 但我注意到它有时返回列表中的字典 但在其他情况下仅返回字典 没有列表 from sympy import x y symbols x y q 16 x 0 5 y 0 5 solve diff q x
  • 如何使 Autodesk Forge Viewer 支持 .rcp 文件

    我有一个 Web 项目 React 使用 Autodesk Forge Viewer 显示我们的企业 BIM360 帐户中的 3D 和 2D 模型 自去年以来 在 BIM360 中运行的同一查看器现在支持 rcp文件 我们也希望允许它 但到
  • 下载文件时文件名中出现空格问题

    以下 java 代码用于通过 Web 应用程序下载请求日志文件 protected HttpServletResponse response response setContentType application octet stream
  • W3C HTML 验证器中的 Angular2 语法

    Angular 1 x 允许将元素放入 HTML 中 而这在当时并不为人所知W3C HTML 验证器 https validator w3 org nu 解决方法是添加data 前缀并写入例如data ng repeat代替ng repea
  • 从 Java 中的 JSON 数组对象获取字符串值

    编辑 我实际上找到了答案 我无法关闭问题 因为我是新人 我能够使用 Array getString i 返回所需的字符串值 感谢您的所有帮助 我有这样的 JSON List example1 example2 example3 exampl
  • 如何使 xtick 与 Python matplotlib 中的 xlim 不同?

    我想用 Python 制作一年中每天的动态图 X轴的axes将是12个月 这个过程在Matplotlib中将是一个barh 代码如下 import random import datetime import matplotlib pyplo
  • PHP:定义具有可变参数计数的函数? [复制]

    这个问题在这里已经有答案了 有没有一种方法可以在 PHP 中定义一个函数 让您定义可变数量的参数 用我更熟悉的语言来说是这样的 function myFunction rest rest array of params return res
  • 如果不存在则不工作

    IF NOT EXISTS SELECT FROM user WHERE name Rutvij AND lang python BEGIN INSERT INTO user VALUES Rutvij python 25 END ELSE
  • jQuery UI 对话框的行为不可预测

    jQuery UI 对话框让我感到厌烦 据我所知 它的工作原理如下 当你这样做时 myDialog dialog 它复制 myDialog 元素并将其移动到 body 标记底部的这个奇怪的小部件中 这太疯狂了 执行此操作时 它会复制可能唯一
  • Ruby 按列对 .dat 文件进行排序

    我对红宝石很陌生 我正在尝试打开文件 dat 并按第二列降序排序 到目前为止 我能够打开该文件并阅读全部内容 请问有什么建议吗 非常感谢 file 1 88 59 74 53 8 0 00 280 9 6 270 17 1 6 93 23
  • 使用 Carrierwave 和 rmagick 上传到 s3 的 exif 图像旋转问题

    我的 Rails 应用程序中有照片上传功能 该应用程序通过 rmagick 和雾通过 Carrierwave 直接上传到 s3 我遇到的问题是 当通过手机通过肖像中的 拍照选项 上传照片时 注意这是 iPhone 上的 但我相信 Andro