Frage Rails Carrierwave Base64 Bild hochladen


Was ist der beste Weg, um ein Bild von einem Client zu einem Rails-Backend mit Carrierwave hochladen. Im Moment sendet unser iOS-Entwickler die Dateien als base64, so dass die Anfragen wie folgt eintreffen:

"image_data"=>"/9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAHqADAAQAAAABAAAAHgAAAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAAeAB4DAREAAhEBAxEB/8QAHwAAAQUBAQE....

Also, meine Frage ist wirklich zwei Fragen. Soll ich ihm sagen, dass er ein anderes Dateiformat senden soll? Wenn base64 der richtige Weg ist, diese Dateien zu senden, wie gehe ich dann in carrierwave damit um?


16
2018-02-15 17:25


Ursprung


Antworten:


Ich denke, dass eine Lösung darin bestehen kann, die dekodierten Daten in einer Datei zu speichern und diese Datei dann einem angehängten Uploader zuzuordnen. Und danach diese Datei loswerden.

Die andere (speicherinterne) Lösung kann diese sein:

# 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

27
2018-02-15 21:59



Alte Frage, aber ich musste eine ähnliche Sache machen, Bild von Base64-String hochladen, die über eine JSON-Anfrage weitergegeben wurde. Das habe ich getan:

#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

4
2018-06-17 07:06



Sie können das leicht erreichen Carrierwave-Base64 Gem Sie müssen nicht selbst mit den Daten umgehen, Sie müssen lediglich den Edelstein hinzufügen und Ihr Modell ändern

mount_uploader :file, FileUploader

zu

mount_base64_uploader :file, FileUploader

und das ist es, jetzt können Sie leicht sagen:

Attachment.create(file: params[:file])

4
2018-04-04 10:47