4


3

Ruby on RailsへのiPhoneイメージ-不正なコンテンツ本体、parse_multipart

iPhoneからRuby on Rails(RoR)サーバーに画像をアップロードしようとしていますが、次のエラーが表示されます。

!\ FAILSAFE /!\  Thu Nov 11 23:51:39 CET 2010
Status: 500 Internal Server Error
bad content body
/usr/lib/ruby/gems/1.8/gems/rack-1.0.1/lib/rack/utils.rb:319:in `parse_multipart'

multipart / form-dataで文字列の値を設定する下の行を省くと、RoRサイトへの通信が正常に機能します。

iPhoneコード:

 NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"logo1" ofType:@"png"];
 NSData *imageData   = [NSData dataWithContentsOfFile:imagePath];

 NSString *urlString = [NSString stringWithFormat:@"%@/user/iphone_results_to_website/",
     serverString ];
 NSMutableURLRequest *imageRequest = [[[NSMutableURLRequest alloc] init] autorelease];
 [imageRequest setURL:[NSURL URLWithString:urlString]];


 [imageRequest setHTTPMethod:@"POST"];
 NSString *boundary = [NSString stringWithString:@"---------------------------  14737809831466499882746641449"];
    // Works fine without this next line:
 [imageRequest setValue: [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] forHTTPHeaderField:@"Content-Type"];

 NSMutableData *body = [NSMutableData dataWithCapacity:[imageData length] + 512];
 [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
 [body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"logo1.png\"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
 [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
 [body appendData:[NSData dataWithData:imageData]];
 [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
 [imageRequest setHTTPBody:body];

 theConnection = [[NSURLConnection alloc] initWithRequest:imageRequest
         delegate:self];


 if(theConnection) {
  theConnectionData = [[NSMutableData data] retain];
  // theData is an instance variable
 } else {
  // failed to make connection
 }

RoR側には、RMagick、ImageMagick、およびattachment_fuがインストールされており、attachment_fuの写真モデルを次のようにセットアップしています。

RoR写真モデル:

class Photo < ActiveRecord::Base

 has_attachment :storage       => :file_system,
             :resize_to     => '640x480',
             :thumbnails    => { :thumb => '160x120', :tiny => '50>' },
             :max_size      => 5.megabytes,
             :content_type  => :image,
             :processor     => 'Rmagick'
  validates_as_attachment
  belongs_to :user

###########################################################################

def uploaded_picture=(picture_field)
self.name          = base_part_of(picture_field.original_fielname)
self.content_type  = picture_field.content_type.chomp
self.data          = picture_field.read

end  # uploaded_picture

###########################################################################

def base_part_of(file_name)

 File.basename(file_name).gsub(/[^\w._-]/, '')

end  # base_part_of

###########################################################################


end

誰もが問題があり得ることを知っていますか? 問題は、Objective-Cコードにあるのでしょうか、それともRoR側にあるのでしょうか?

2 Answer


0


これはrack-1.0.1のバグのようです:

最新バージョンのラックにアップグレードするには、Railsを2.3.9にアップグレードする必要があります。

いいえ、私は間違っていました、あまりにも早く話しました。 Rails 2.3.9およびrack-1.1.0でこのエラーが引き続き発生します。

編集する

動作させるには、この行を削除する必要がありました。

 [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];


0


フォローアップしたいのですが、前者は私にはぴったりとは言えませんでしたが、同様の問題がありました。 ただし、次の例は機能しました。 同様の行をコメントアウトしました。