使用Objective-C和iOS的ASIFormDataRequest将带有一些参数的照片上传到RubyonRails web应用程序

使用Objective-C和iOS的ASIFormDataRequest将带有一些参数的照片上传到RubyonRails web应用程序,objective-c,ruby-on-rails,ios,asihttprequest,passenger,Objective C,Ruby On Rails,Ios,Asihttprequest,Passenger,我需要从iOS应用程序(iOS 4)向我的客户端服务器上传照片列表(一次可以上传一张)。他的服务器使用Apache服务器(Ubuntu)上的Phusion Passenger 2.2.14模块来部署他的Ruby应用程序 下面是我的客户端使用Ruby rest客户端上传照片时使用的Ruby代码,该代码适用于一幅图像。他说图像应该在一个数组中,但因为这里我们只发送一个图像,所以它起作用了 resource = RestClient::Resource.new 'http://serveraddres

我需要从iOS应用程序(iOS 4)向我的客户端服务器上传照片列表(一次可以上传一张)。他的服务器使用Apache服务器(Ubuntu)上的Phusion Passenger 2.2.14模块来部署他的Ruby应用程序

下面是我的客户端使用Ruby rest客户端上传照片时使用的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
property[new_images][1][name]=Sink
属性[新图片][1][创建于]=
物业[new_images][1][attached_file]=
物业[新图片][1][房间]=厨房
属性[新图片][1][附件类型]=定期
属性[new_images][1][public]=0
属性[新图片][1][t\u可查看]=0
属性[新图片][1][l\u可查看]=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"}
{“格式”=>“json”,
“属性”=>
{“新图片”=>
{"0"=>
{“租户\可查看”=>“0”,
“名称”=>“照片2011-10-01 08:43:07+0000.jpg”,
“房东可查看”=>“0”,
“附件”=>“#”,
“创建于”=>“1317459424.523741”,
“附件类型”=>“定期检查”,
“公共”=>“0”,
“房间”=>“厨房”}}},
“操作”=>“更新”,
“id”=>“866”,
“控制器”=>“属性”}
动作属性#更新

网址

文件[GEM_ROOT]/gems/activerecord-2.2.2/lib/active_record/base.rb:2587



现在看来很清楚,服务器不需要属性0(在属性“new_images”之后)。它似乎更像是一个数组位置,而不是一个属性。

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来比较emulator上工作的ruby代码和非工作的iOS代码发送的请求。

要一次对一个图像执行此操作,需要设置完整的属性键值

[request setPostValue:@"Sink" forKey:@"property[new_images][1][name]"];
[request setPostValue:<timestamp> forKey:@"property[new_images][1][created_at]"];
....
[request setPostValue:@“Sink”forKey:@“property[new_images][1][name]”;
[请求setPostValue:forKey:@“属性[新图片][1][created_at]”;
....
单调乏味,但我不确定您是否可以直接使用NSDictionary设置单键
属性
。别以为我那么聪明

要对数组执行此操作,只需枚举图像数组,并将请求键名称的
[1]
部分设置为实际索引(例如[1]、[2]、[3]等)


我想那应该行。

谢谢你的回答。我的代码中的请求已经是ASIFormDataRequest。我只是想提一下。关于Charles Proxy,使用它而不是记录请求的属性(responseHeaders等)会很方便。我不确定我的问题是否足够清楚,因为我更想知道如何设置ruby代码中的参数。谢谢,我不是ruby专家,但我确实知道ASIHTTPRequest——如果您使用charlesproxy查看每种情况下发送到服务器的原始文本是什么,并告诉我们您的iOS和ruby版本有何不同,那么我们可以告诉您如何更改iOS版本以使其正常工作。不幸的是,NSLogging没有帮助-我发现比较实际工作请求(由charlesproxy、wireshark等捕获)和非工作请求是找出如何修复非工作请求的最简单方法。是的,NSLogging没有多大帮助。。。。希望我最终能够访问服务器端的错误日志,这样调试就容易多了。我现在将错误摘要添加到问题中。谢谢。我更正了代码并重试。然而,我仍然得到一个500内部服务器错误。有什么想法吗?我会让那个家伙给我发送这个请求的服务器日志。我会接受你的回答,因为最终运行的代码与你发布的非常相似。我只是需要删除[1]才能看到上传的照片。此格式是我尝试的第一种格式之一,但由于我无法访问服务器端的错误日志,我不知道错误完全与此数组[0]、[1]等有关。但是,我认为服务器应该接受此格式。。。我现在必须弄清楚如何发送一系列照片。我也可以排个队,把照片一张一张地放进去。可能更容易知道哪些照片是真正上传的。非常感谢!!