2011-01-31 5 views
2

Я думаю, что мне удалось отправить фотографию с iPhone на Rails с использованием формата Multipart, но как только фотография попадает на сервер Rails, я не могу понять, как чтобы сохранить его правильно. Я думаю, что файл появляется в Params на сервере Rails, как «UserFile» в конце параметров ниже, когда iphone_photo_to_website называется:Загрузить фото с iPhone на сервер Rails с attachment_fu

Parameters: {"action"=>"iphone_photo_to_website","id"=>"8A39FA8F_1ADD_52AB_8387_E1C5CFC4AB2D", "controller"=>"users", "userfile"=>#<File:/tmp/RackMultipart30053-0>} 

Я посылаю фото с iPhone, используя следующий код Objective-C из следующего SO вопрос:

How can I upload a photo to a server with the iPhone?

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

NSString *urlString = [NSString stringWithFormat:@"%@/users/iphone_photo_to_website/%@", 
        serverString, UID]; 


NSMutableURLRequest *imageRequest = [[NSMutableURLRequest alloc] init] ; 
[imageRequest setURL:[NSURL URLWithString:urlString]]; 
[imageRequest setHTTPMethod:@"POST"]; 
NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"]; 
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary]; 
[imageRequest setValue:contentType forHTTPHeaderField: @"Content-Type"]; 
NSMutableData *body = [NSMutableData dataWithCapacity:[imageData length] + 512]; 
[body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]]; 
[body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"logo1.png\"\r\n\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]; 

на сервере Rails миграции фото в дб/мигрирует выглядит следующим образом:

class CreatePhotos < ActiveRecord::Migration 
    def self.up 
    create_table :photos do |t| 

     t.column :user_id, :integer 
     t.column :title, :string 
     t.column :body, :text 
     t.column :created_at, :datetime 

# the following are for attachment_fu 

     t.column :photo, :binary 
     t.column :content_type, :string 
     t.column :filename, :string 
     t.column :size, :integer 
     t.column :parent_id, :integer 
     t.column :thumbnail, :string 
     t.column :width, :integer 
     t.column :height, :integer 


    end 
    end 

    def self.down 
    drop_table :photos 
    end 
end 

На сервере Rails У меня есть фото модели приложение/модели/photo.rb со следующим кодом:

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 
end 

и контроллер Rails имеет следующий код:

def iphone_photo_to_website 
    @udid   = params[:id] 
    @userfile  = params[:userfile] 

    @photo_params = { :user_id    => @user.id, 
        :photo     => @userfile, 
        :content_type   => 'image', 
        :filename    => @userfile.original_path, 
        :uploaded_data   => @userfile 
        } 
image = Photo.new(@photo_params) 
image.save 


end 

Когда " image.save "выполняет, он возвращает" false ". Кто-нибудь знает, как я могу найти, какая ошибка вызывает изображение.save возвращает false? Или кто-нибудь знает, как я могу правильно сохранить фотографию в базе данных?

ответ

1

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

@userfile  = params[:userfile] 

    image = Photo.new(:uploaded_data => params[:userfile]) 

    image.user_id   = @user.id 
    image.photo   = @userfile 
    image.width   = 105 
    image.height   = 104 
    basename    = File.basename(image.filename).gsub(/[^\w._-]/, '') 
    image.content_type  = "image/" + basename.split("\.")[1] 

    image.save 

Когда изображение создается как Photo.new используя uploaded_data поле, то image.filename получает набор.

Мне также пришлось удалить следующую строку из кода Objective-C на iPhone, чтобы заставить работать.

[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; 
Смежные вопросы