ruby-on-rails - mount_uploader - gema carrierwave
Rails Carrierwave Base64 subir imagen (3)
Creo que una solución puede ser guardar los datos descodificados en un archivo y luego asignar este archivo al cargador montado. Y después de eso deshacerse de ese archivo.
La otra solución (en memoria) puede ser esta:
# define class that extends IO with methods that are required by carrierwave
class CarrierStringIO < StringIO
def original_filename
# the real name does not matter
"photo.jpeg"
end
def content_type
# this should reflect real content type, but for this example it''s ok
"image/jpeg"
end
end
# some model with carrierwave uploader
class SomeModel
# the uploader
mount_uploader :photo, PhotoUploader
# this method will be called during standard assignment in your controller
# (like `update_attributes`)
def image_data=(data)
# decode data and create stream on them
io = CarrierStringIO.new(Base64.decode64(data))
# this will do the thing (photo is mounted carrierwave uploader)
self.photo = io
end
end
¿Cuál es la mejor manera de cargar una imagen de un cliente a un back-end de Rails usando Carrierwave? En este momento, nuestro desarrollador de iOS está enviando los archivos como base64, por lo que las solicitudes son las siguientes:
"image_data"=>"/9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAHqADAAQAAAABAAAAHgAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAAeAB4DAREAAhEBAxEB/8QAHwAAAQUBAQE....
Entonces, mi pregunta es realmente dos preguntas. ¿Debo decirle que envíe un formato de archivo diferente? Si base64 es la forma correcta de enviar estos archivos, entonces, ¿cómo los trato en carrierwave?
Pregunta antigua, pero tuve que hacer algo similar, subir una imagen de la cadena base64 que se transmitió a través de una solicitud json. Esto es lo que terminé haciendo:
#some_controller.rb
def upload_image
set_resource
image = get_resource.decode_base64_image params[:image_string]
begin
if image && get_resource.update(avatar: image)
render json: get_resource
else
render json: {success: false, message: "Failed to upload image. Please try after some time."}
end
ensure
image.close
image.unlink
end
end
#some_model.rb
def decode_base64_image(encoded_file)
decoded_file = Base64.decode64(encoded_file)
file = Tempfile.new([''image'',''.jpg''])
file.binmode
file.write decoded_file
return file
end
Puede lograr fácilmente que con Carrierwave-base64 Gem no tenga que manejar los datos usted mismo, todo lo que debe hacer es agregar la gema y cambiar su modelo desde
mount_uploader :file, FileUploader
a
mount_base64_uploader :file, FileUploader
Y eso es todo, ahora puedes decir fácilmente:
Attachment.create(file: params[:file])