rails mount_uploader imageuploader gema aws ruby-on-rails ruby carrierwave

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])