образ iphone для Ruby on Rails - неверное содержимое, parse_multipart - PullRequest
4 голосов
/ 12 ноября 2010

Я пытаюсь загрузить изображение с 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'

Связь с сайтом RoR работает нормально, когда я опускаю строку ниже, где я устанавливаю значение для строки с multipart / form-data.

код 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 ]

0 голосов
/ 21 июля 2011

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

http://www.travisdunn.com/posting-multipart-file-uploads-on-the-iphone

0 голосов
/ 12 ноября 2010

Похоже, это была ошибка в rack-1.0.1:

http://jira.codehaus.org/browse/JRUBY-4892

Обновление стойки до последней версии требует обновления Rails до 2.3.9.

Нет, я был неправ, говорил слишком рано. Я все еще вижу эту ошибку с Rails 2.3.9 и rack-1.1.0.

Edit:

Мне пришлось удалить эту строку, чтобы она заработала:

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