Attachment_FUを使用して、iPhoneからRailsサーバーに写真をアップロードします
-
27-10-2019 - |
質問
MultiPart形式を使用してiPhoneからRailsに写真を送信することができたと思いますが、写真がRailsサーバーに届くと、正しく保存する方法がわかりません。このファイルは、iPhone_photo_to_websiteが呼び出されたときに、以下のパラメーターの最後に「userfile」としてRailsサーバー上のパラメーションに表示されると思います。
Parameters: {"action"=>"iphone_photo_to_website","id"=>"8A39FA8F_1ADD_52AB_8387_E1C5CFC4AB2D", "controller"=>"users", "userfile"=>#<File:/tmp/RackMultipart30053-0>}
次のObjective-Cコードを使用してiPhoneから写真を送信します。質問は次のとおりです。
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サーバーでは、db/移行の写真移行が次のように見えます。
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」を返します。 Image.saveがfalseを返している原因となっているエラーをどのように見つけることができるかを知っていますか?それとも、データベースで写真を正しく保存する方法を誰かが知っていますか?
解決
次のコードを使用して、ついに画像をデータベースに保存することができました。
@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
画像がuploaded_dataフィールドを使用してphoto.newとして作成されると、image.filenameが設定されます。
また、iPhoneのObjective-Cコードから次の行を削除して、物事を機能させる必要がありました。
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
所属していません StackOverflow