Загрузите фотографию с некоторыми параметрами в веб-приложение Ruby-on-rails, используя Objective-C и ASIFormDataRequest для iOS - PullRequest
0 голосов
/ 30 сентября 2011

Мне нужно загрузить список фотографий (может быть по одной) на сервер моего клиента из приложения iOS (iOS 4).Его сервер использует модуль Phusion Passenger 2.2.14 на Apache Server (Ubuntu) для развертывания своего приложения Ruby.

Вот код Ruby, который мой клиент использовал для загрузки фотографии с помощью клиента отдыха Ruby, и он работал дляодно изображение.Он отметил, что изображение должно быть в массиве, но поскольку здесь мы отправляем только одно изображение, оно сработало.

resource = RestClient::Resource.new 'http://serveraddress.com/id.json', :user => '********', :password => '*****'

resource.put :property => {:new_images => {:public => '0',:t_viewable => '0', :l_viewable => '0', :name => 'name3', :room => 'Bathroom', :attachment_type => 'periodic', :attached_file => File.new('/Users/me/Pictures/12618298.jpg','rb')} }

У меня вопрос: как мне кодировать эти данные с использованием коллекций Objective-C?Аутентификация работает нормально.

Вот код, который я использую, но он получает 500 Внутренняя ошибка сервера:

[request setPostValue:photoName forKey:@"property[new_images][0][name]"];

[request setPostValue:[NSString stringWithFormat:@"%f",[[NSDate date] timeIntervalSince1970]] forKey:@"property[new_images][0][created_at]"];

[request setFile:photoPathFull withFileName:[self.localCaptions objectAtIndex:index] andContentType:@"image/jpeg"
          forKey:@"property[new_images][0][attached_file]"];

[request setPostValue:self.room forKey:@"property[new_images][0][room]"];

[request setPostValue:imageCategory forKey:@"property[new_images][0][attachment_type]"];

[request setPostValue:public forKey:@"property[new_images][0][public]"];
[request setPostValue:tViewable forKey:@"property[new_images][0][t_viewable]"];
[request setPostValue:lViewable forKey:@"property[new_images][0][l_viewable]"];

* Обратите внимание, что переменная запроса является объектом ASIFormDataRequest.

Он также указал, что сервер ожидает следующие параметры:

property[new_images][1][name]=Sink
property[new_images][1][created_at]=<timestamp>
property[new_images][1][attached_file]=<filedata>
property[new_images][1][room]=Kitchen 
property[new_images][1][attachment_type]=periodic
property[new_images][1][public]=0
property[new_images][1][t_viewable]=0
property[new_images][1][l_viewable]=0

Спасибо,


Я наконец-то получил доступ к журналу ошибок на стороне сервера, так что вот чтоэто выглядит так:


ActiveRecord :: UnknownAttributeError: неизвестный атрибут: 0

{"format"=>"json",
 "property"=>
  {"new_images"=>
    {"0"=>
      {"tenant_viewable"=>"0",
       "name"=>"photo2011-10-01 08:43:07 +0000.jpg",
       "landlord_viewable"=>"0",
       "attached_file"=>"#<File:0xda0361c>",
       "created_at"=>"1317459424.523741",
       "attachment_type"=>"periodic_check",
       "public"=>"0",
       "room"=>"Kitchen"}}},
 "action"=>"update",
 "id"=>"866",
 "controller"=>"properties"}

Свойства действия # update

URL http://server.com/000.json

Файл [GEM_ROOT] /gems/activerecord-2.2.2/lib/active_record/base.rb:2587


Теперь ясно, что атрибут 0 (после атрибута "new_images") не ожидаетсяс сервера.Похоже, это скорее позиция массива, чем атрибут.

Ответы [ 2 ]

0 голосов
/ 01 октября 2011

, чтобы сделать это для одного изображения за раз, вам нужно установить полное значение ключа свойства

[request setPostValue:@"Sink" forKey:@"property[new_images][1][name]"];
[request setPostValue:<timestamp> forKey:@"property[new_images][1][created_at]"];
....

Утомительно, но я не уверен, что вы можете установить один ключ property, используя NSDictionaryнепосредственно.Не думайте, что ASI такой умный.

Чтобы сделать это для массива, просто перечислите ваш массив изображений и установите для части [1] имени ключа запроса фактический индекс (например, [1], [2], [3] и т.д ...)

Я думаю, что это должно работать.

0 голосов
/ 30 сентября 2011

ASIHTTPRequest не может автоматически выполнить преобразование массива в HTTP POST, как это.

Попробуйте вместо этого использовать ASIFormDataRequest:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];

// Upload a file on disk
[request setFile:@"/Users/ben/Desktop/ben.jpg" withFileName:@"myphoto.jpg" andContentType:@"image/jpeg" forKey:@"photo"];

Вам, вероятно, придется в какой-то степени поэкспериментировать, чтобы точно определить правильный формат. Я советую использовать charlesproxy для сравнения запросов, отправленных вашим рабочим кодом ruby ​​и нерабочим кодом iOS на эмуляторе.

...