2012-04-02 3 views
0

Ich weiß nicht, ob das Problem in meinem PHP-Code oder auf der Ziel-C-Seite ist. Ich verstehe das nicht sehr gut und würde mich über jede Hilfe freuen, wenn ich Dateien von der iPad App, die ich erstelle, in eine MySQL-Datenbank hochlade. Im Moment wird nur die Beschreibung der Datei in die Datenbank geschrieben, aber der Blob/die Datei nicht. Jede Hilfe würde sehr geschätzt werden!Warum wird meine Datei nicht vom iPad auf die MySQL-Datenbank hochgeladen?

Hier ist meine PHP-Code:

<?php 
$username = "person"; 
$password = "xxxxxxx"; 
$database = "database"; 

mysql_connect(localhost,$username,$password); 
mysql_select_db($database) or die("Unable to select database"); 

$file = $_FILES['file']; 
$name = $file['tmp_name']; 
$testpage = file_get_contents($name); 
$testpage = mysql_real_escape_string($testpage); 

mysql_query("INSERT INTO tbldocs(Title,Document) VALUES('some title','$testpage')");    
mysql_close(); 
?> 

Hier mein Objective-C-Code ist, es in ein Paket HTTP Verpackung

NSMutableDictionary* post_dict = [[NSMutableDictionary alloc] initWithCapacity:2]; 
[post_dict setObject:@"test_value" forKey:@"test_key"]; 
[post_dict setObject:[NSURL fileURLWithPath:[pdfUrl absoluteString]] forKey:@"file"]; 
NSData* regData = [self generateFormData:post_dict]; 
[post_dict release]; 

NSMutableURLRequest* post = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:@"http://myserver/upload.php"]]; 
[post addValue: @"multipart/form-data; boundary=_insert_some_boundary_here_" forHTTPHeaderField: @"Content-Type"]; 
[post setHTTPMethod: @"POST"]; 
[post setHTTPBody:regData]; 
NSURLResponse* response; 
NSError* error; 
NSData* result = [NSURLConnection sendSynchronousRequest:post returningResponse:&response error:&error]; 
NSLog(@"%@", [[[NSString alloc] initWithData:result encoding:NSASCIIStringEncoding] autorelease]); 

Danke, Rossi

Antwort

1

Die Variable $file['name'] ist der Name der Datei, die im Upload hochgeladen wurde (zB der Dateiname vom lokalen System).

Die Variable $file['tmp_name'] ist der Name der Datei auf dem Server. Dies ist der Name der Datei, die den Inhalt enthält, den Sie in die Datenbank einfügen möchten.

Das sollte die PHP-Seite adressieren. Der Objective-C-Code ist etwas komplizierter. Sie müssen den mime-codierten Inhalt, der beim Upload verwendet wird, manuell erstellen. Es gibt eine simple example auf CocoaDev im generateFormData Methode, in der Zeile Beispiel:

[post_dict setObject:[NSURL fileURLWithPath:@"/Butterfly.tif"] forKey:@"file1"]; 

er den PHP-Äquivalent der $_FILE['file1'] variable Einstellung hier, in Ihrem Fall, mögen Sie wahrscheinlich forKey:@"file" statt wählen.

Bearbeiten In sich geschlossene synchrone Variante. Ich habe die folgenden Parameter: DestUrl - eine NSURL mit dem Ziel, fileName - ein NSString mit dem Namen der Datei und schließlich FileData, eine NSData, die den Inhalt der Datei enthält.

NSMutableData *data = [[NSMutableData alloc] initWithCapacity:100]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:DestUrl]; 
[request setHTTPMethod:@"POST"]; 
// Define the boundary 
NSString *boundary = [NSString stringWithFormat:@"weasel_grapple_%ld_foo", (long)time(NULL)]; 
// Tell MIME that content type 
[request addValue:[NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary] 
    forHTTPHeaderField:@"Content-Type"]; 
// First piece of data 
[data appendData:[[NSString stringWithFormat:@"--%@\n", boundary] dataUsingEncoding:NSASCIIStringEncoding]]; 
// Add in the form field name (name), filename 
[data appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@\"\n", 
        @"file", fileName] dataUsingEncoding:NSASCIIStringEncoding]]; 
// And it's binary data here 
[data appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\n\n"] dataUsingEncoding:NSASCIIStringEncoding]]; 
// This is content of the file 
[data appendData:FileData]; 
// Need a blank link as a separator of form-data items 
[data appendData:[[NSString stringWithString:@"\n"] dataUsingEncoding:NSASCIIStringEncoding]]; 
// Mark the end of the upload message 
[data appendData:[[NSString stringWithFormat:@"--%@--\n", boundary] dataUsingEncoding:NSASCIIStringEncoding]]; 

[request setHTTPBody:data]; 

NSURLResponse *response; 
NSError *error; 
NSData *retData = [NSURLConnection sendSynchronousRequest:request 
              returningResponse:&response 
               error:&error]; 

Wenn Sie eine Datei-URL zu nehmen, und schalten Sie ihn in Filedata dann tun: NSData * Filedata = [NSData dataWithContentsOfFile: fileURL];

Auf der PHP-Seite, testen Sie zuerst mit einem einfachen Upload-Formular, um sicherzustellen, dass die hochgeladenen Daten in die Datenbank gelangen und von dort arbeiten.

Mein Schnipsel von Datei-Upload in die Datenbank auf der PHP-Seite sieht aus wie. Es ist ziemlich schrecklich, aber es wird den Upload über die Linie .:

foreach ($_FILES as $key => $value) { 
    $file_tag = $key; 
    $fname = basename($value['name']); 
    $name = $value['tmp_name']; 

    $testpage = file_get_contents($name); 
$testpage = addslashes($testpage); 

    mysql_query("INSERT INTO tbldocs(Title,Document) VALUES('some title','$testpage')"); 
} 

Beachten Sie auch: Wenn der Upload-Datei größer als 64 KB ist dann Sie Document als Feldtyp MEDIUMBLOB angeben müssen. Der reguläre BLOB Datentyp unterstützt nur 64K Daten.

+0

danke, ich gab das einen Schuss - siehe meine Änderungen, aber immer noch keine Würfel ... alles, was ich bekomme, ist der Name der Datei in der db. – Rossi

+0

Ich habe seine generateFromData-Methode verwendet und meinen Code wie vorgeschlagen geändert. Die oben gezeigten Änderungen. Es funktioniert immer noch nicht, aber ich schätze deine Hilfe sehr! Hast du zufällig etwas anderes gesehen, was falsch sein könnte? – Rossi

+0

SIE SIND ERNSTLICH MEIN HELD. ERNST. Danke für die Hilfe! Ich schätze das wirklich sehr! Es funktioniert und ist wirklich großartig. – Rossi

Verwandte Themen