BSON::InvalidDocument при вставке в MongoDB из клиента iOS

Я создаю базовое приложение для блога с бэкэндом rails/mongoid и клиентом iOS, в котором есть модель сообщений с именем и изображением. Я получаю следующую ошибку, когда создаю новую позицию из приложения iOS.

  BSON::InvalidDocument 
(Cannot serialize an object of class ActionDispatch::Http::UploadedFile into BSON.):
      app/controllers/posts_controller.rb:47:in `create'
      app/controllers/posts_controller.rb:46:in `create'

На стороне iOS я использую ASIHttpRequest со следующим кодом:

 NSURL *url=[[NSURL alloc] initWithString:@"http://localhost:3000/posts"];
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
    [request setPostValue:@"Ben" forKey:@"[post] name"];
    [request setFile:@"/Users/Seb/Desktop/beach.jpeg" forKey:@"[post] image"]; 
    [request startSynchronous];  

Журнал сервера показывает:

Started POST "/posts" for 127.0.0.1 at Thu May 05 14:37:10 -0700 2011
  Processing by PostsController#create as HTML
  Parameters: {"post"=>{" name"=>"Ben", " image"=>#<ActionDispatch::Http::UploadedFile:0x103e48fc8 @content_type="image/jpeg", @original_filename="beach.jpeg", @headers="Content-Disposition: form-data; name=\"[post] image\"; filename=\"beach.jpeg\"\r\nContent-Type: image/jpeg\r\n", @tempfile=#<File:/var/folders/PI/PI+kcHrCHfuDh-K+ppxAxE+++TI/-Tmp-/RackMultipart20110505-11613-x75qie-0>>}}
Completed   in 21ms

BSON::InvalidDocument (Cannot serialize an object of class ActionDispatch::Http::UploadedFile into BSON.):
  app/controllers/posts_controller.rb:47:in `create'
  app/controllers/posts_controller.rb:46:in `create'

Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.6/lib/action_dispatch/middleware/templates/rescues/_trace.erb (2.3ms)
Rendered /Library/Ruby/Gems/1.8/gems/actionpack-3.0.6/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (9.5ms)

person John    schedule 05.05.2011    source источник


Ответы (2)


Сообщение об ошибке указывает, что следующий класс не может быть сериализован в BSON: ActionDispatch::Http::UploadedFile.

Основываясь на вашем сообщении в журналах сервера, вы отправляете объект JSON с необычным полем «изображение». Подозреваю, что проблема здесь.

Похоже, ваши файлы хранятся во временном месте на диске. Вы пытаетесь сохранить фактические байты файла или только это временное местоположение? Вы используете GridFs здесь?

Можете ли вы подтвердить, что класс действительно может быть сериализован в BSON? Правильно ли работает эта сериализация?

person Gates VP    schedule 05.05.2011
comment
Он должен сохранить фактическое изображение в папке изображений моего приложения rails. Я не храню изображение в Mongo, только адрес изображения. Я в основном отправляю для создания нового сообщения, следуя указаниям для ASIFormDataRequest. - person John; 06.05.2011
comment
Я столкнулся с этой проблемой из-за опечатки в имени ввода формы imamge вместо изображения. Тск тск. - person Peter Ehrlich; 03.12.2011

Ошибка вполне очевидна, и если вы не хотите использовать скрепку или другое решение, у вас будет сделать это самостоятельно.

Например, если у вас есть поле :blob и поле :filename в вашей модели, то для сохранения вам понадобится что-то вроде этого в вашей модели:


class Post
...
  def image=(img)
    self.filename = img.original_filename
    self.blob = img.read
  end
end
person Roman    schedule 07.05.2011