Laden Sie das Foto vom iPhone zum Rails -Server mit Attafment_FU hoch hoch
-
27-10-2019 - |
Frage
Ich glaube, ich konnte ein Foto mit dem Mehrteil -Format vom iPhone an Schienen schicken, aber sobald das Foto auf den Rails -Server gelangt, kann ich nicht herausfinden, wie ich es richtig speichern kann. Ich denke, die Datei wird in den Params auf dem Rails -Server als "Benutzerfile" am Ende der folgenden Parameter angezeigt, wenn iPhone_Photo_to_Website aufgerufen wird:
Parameters: {"action"=>"iphone_photo_to_website","id"=>"8A39FA8F_1ADD_52AB_8387_E1C5CFC4AB2D", "controller"=>"users", "userfile"=>#<File:/tmp/RackMultipart30053-0>}
Ich sende das Foto aus dem iPhone mit dem folgenden Objektiv-C-Code aus der folgenden Frage:
Wie kann ich ein Foto mit dem iPhone auf einen Server hochladen?
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];
Auf dem Rails -Server sieht die Fotomigration in DB/Migrate aus wie:
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
Auf dem Rails -Server habe ich eine Fotododell -App/Modelle/Foto.RB mit dem folgenden Code:
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
Und der Rails Controller hat den folgenden Code:
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
Wenn "Image.save" ausgeführt wird, gibt es "falsch" zurück. Weiß jemand, wie ich finde, welcher Fehler das Bild verursacht. Oder weiß jemand, wie ich das Foto in der Datenbank richtig speichern kann?
Lösung
Ich konnte das Bild endlich mit dem folgenden Code in der Datenbank speichern:
@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
Wenn das Bild als Foto erstellt wird. Neue mit dem Feld Uploaded_Data, wird der Bild.filename eingestellt.
Ich musste auch die folgende Zeile aus dem Objektiv-C-Code auf dem iPhone entfernen, um die Dinge zum Laufen zu bringen.
[body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];