处理图像 rails 5
Handling images in rails 5
我正在使用 Rails 5 开发一个 api 应用程序。从客户端我有一个 Anuglar 应用程序。
我有以下要求:
- 图片异步上传。 (请注意,这意味着图像第一次没有附加到模型)。
- 要创建的模型可以附加 N 张图像。
- 为每张上传的图片创建M张指定的缩略图。 (还请注意,缩略图应附在模型上。)
我已经阅读了有关 CarrierWave 和回形针的信息,但我没有找到如何满足所有这些要求。
我将非常感谢任何涵盖所有这些要求的建议、库、gem 等。
我已经用 CarrierWave gem 实现了类似的东西。假设您想要将图像附加到模型 Post
.
模型中:
class Post < ActiveRecord::Base
has_many :photos, inverse_of: :post
end
然后你就可以拥有照片模型了:
class Photo < ActiveRecord::Base
belongs_to :post
mount_uploader :post_image, PostImageUploader
end
然后你可以把这个加到app/uploaders/post_image_uploader.rb
class PostImageUploader < CarrierWave::Uploader::Base
# Create different versions of your uploaded files:
version :standard do
process resize_to_fit: [800, 800]
end
version :thumb do
process resize_to_fit: [100, 100]
end
end
由于您是通过 api 创建图像,因此您必须将图像转换为 Base64
字符串并作为参数发送。在此示例中,base64 字符串在将其发送到服务器之前位于参数 [:photo][:photo_data]
中。在 photos_controller.rb
中有这个:
def create
@photo = Photo.new(photo_params)
@photo.post_image = decode_photo_data(params[:photo][:photo_data])
if @photo.save
render json: @photo, status: :created, location: @photo
else
render json: @photo.errors, status: :unprocessable_entity
end
end
#decode base64 data to an jpg image:
def decode_photo_data(photo_data)
data = StringIO.new(Base64.decode64(photo_data))
data.class.class_eval { attr_accessor :original_filename, :content_type }
data.original_filename = "upload.jpg"
data.content_type = "image/jpg"
# return decoded data
data
end
def photo_params
params.require(:photo).permit(:caption, :post_id)
end
有了这个,当你向创建照片 api 端点发出 post 请求时,正文如下
{"photo": {"caption": "an image", "post_id": 1, "photo_data":<your image base64 string>}}
它将创建一个 photo
,同时具有 standard
和 thumb
版本,post
的 id
为 1
.
我正在使用 Rails 5 开发一个 api 应用程序。从客户端我有一个 Anuglar 应用程序。
我有以下要求:
- 图片异步上传。 (请注意,这意味着图像第一次没有附加到模型)。
- 要创建的模型可以附加 N 张图像。
- 为每张上传的图片创建M张指定的缩略图。 (还请注意,缩略图应附在模型上。)
我已经阅读了有关 CarrierWave 和回形针的信息,但我没有找到如何满足所有这些要求。
我将非常感谢任何涵盖所有这些要求的建议、库、gem 等。
我已经用 CarrierWave gem 实现了类似的东西。假设您想要将图像附加到模型 Post
.
模型中:
class Post < ActiveRecord::Base
has_many :photos, inverse_of: :post
end
然后你就可以拥有照片模型了:
class Photo < ActiveRecord::Base
belongs_to :post
mount_uploader :post_image, PostImageUploader
end
然后你可以把这个加到app/uploaders/post_image_uploader.rb
class PostImageUploader < CarrierWave::Uploader::Base
# Create different versions of your uploaded files:
version :standard do
process resize_to_fit: [800, 800]
end
version :thumb do
process resize_to_fit: [100, 100]
end
end
由于您是通过 api 创建图像,因此您必须将图像转换为 Base64
字符串并作为参数发送。在此示例中,base64 字符串在将其发送到服务器之前位于参数 [:photo][:photo_data]
中。在 photos_controller.rb
中有这个:
def create
@photo = Photo.new(photo_params)
@photo.post_image = decode_photo_data(params[:photo][:photo_data])
if @photo.save
render json: @photo, status: :created, location: @photo
else
render json: @photo.errors, status: :unprocessable_entity
end
end
#decode base64 data to an jpg image:
def decode_photo_data(photo_data)
data = StringIO.new(Base64.decode64(photo_data))
data.class.class_eval { attr_accessor :original_filename, :content_type }
data.original_filename = "upload.jpg"
data.content_type = "image/jpg"
# return decoded data
data
end
def photo_params
params.require(:photo).permit(:caption, :post_id)
end
有了这个,当你向创建照片 api 端点发出 post 请求时,正文如下
{"photo": {"caption": "an image", "post_id": 1, "photo_data":<your image base64 string>}}
它将创建一个 photo
,同时具有 standard
和 thumb
版本,post
的 id
为 1
.