2016-03-29 10 views
0

Ich versuche, ein Bild an den Server zu senden, aber das Bild sollte im Base64-Format sein. Ich benutze diese Funktion, es zu senden:Unvollständige Base64 beim Senden an Server

func upload_signature_staff(ticket: NSString){ 
     let defaults = NSUserDefaults.standardUserDefaults() 
     let stringOne = defaults.stringForKey(defaultsKeys.staff_id) 
     let stringtwo = defaults.stringForKey(defaultsKeys.mst_customer) 
     let sig = defaults.stringForKey("staff_signature") 
     let request = NSMutableURLRequest(URL: NSURL(string: "http://xxxxxxxxxxxxx/upload.php")!) 
     request.HTTPMethod = "POST" 
     let postString = "action=add_signature&mst_customer=\((stringtwo!))&ticket=\((ticket))&signature=\((sig!))&current_user=\((stringOne!))&item_type=10" 
     print(postString) 
     request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding) 
     let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
      guard error == nil && data != nil else {               // check for fundamental networking error 
       print("error=\(error)") 
       return 
      } 

      if let httpStatus = response as? NSHTTPURLResponse where httpStatus.statusCode != 200 {   // check for http errors 
       print("statusCode should be 200, but is \(httpStatus.statusCode)") 
       print("response = \(response)") 
      } 

      let responseString = NSString(data: data!, encoding: NSUTF8StringEncoding) 
      print("responseString = \(responseString)") 
     } 
     task.resume() 
     //self.performSegueWithIdentifier("goto_main2", sender: self) 
    } 

Die sig Variable den Base64-String hält, wird es in meiner Konsole gedruckt wird, damit ich überprüfen kann, dass die Zeichenfolge korrekt ist. Ich drucke auch die postString und bei der Überprüfung ist es auch richtig, dass die Signatur der Base64 String entspricht. Aber wenn ich phpmyadmin öffne, sehe ich das Feld meines Bildes mit unvollständiger Base64-Zeichenfolge, vielleicht ist nur 1/4 da.

Hier ist meine PHP-Code, falls Sie es sehen:

<?php 
require_once("../c.php"); 

$action = trim($_POST['action']); 

if($action == "add_signature"){ 
    $mst_customer = trim($_POST['mst_customer']); 
    $ticket = trim($_POST['ticket']); 
    $signature = trim($_POST['signature']); 
    $current_user = trim($_POST['current_user']); 
    $item_type = trim($_POST['item_type']); 
    $inputtime = time(); 

    $sql = "INSERT INTO ticket_items SET mst_customer = '$mst_customer', ticket = '$ticket', ticket_item_type = '$item_type', details = '$signature', addedby = '$current_user', lastupdate = '$inputtime' "; 

    mysql_query($sql) or die(mysql_error()); 
} 

?> 
+0

Server-Seite, versuchen Sie festzustellen, ob der Körper 'richtig' (echo, print, log) $ Unterschrift ', um zu sehen, wenn es wie Sie erwarten ist. Wenn ja, überprüfen Sie Ihr Tabellenschema, um sicherzustellen, dass es ein Textfeld mit variabler Länge aufnehmen kann (b64). – YvesLeBorg

+1

@ YvesLeBorg mein Feld ist 'varchar (255)' - vielleicht ist das der Schuldige? Welche Größe sollte ich stattdessen setzen? –

+0

Ich weiß Swift nicht und ich habe Ihren Code nicht gelesen, aber ich muss nur fragen ... Sind Sie für Ihre base64 kodieren? Bricht die Saite bei '+', '=' und '/'? Wenn Ihre Base64-Zeichenfolge immer auf die gleiche Länge gekürzt wird, ignorieren Sie meine Frage und suchen Sie nach Datenbankfeldern, die möglicherweise zu klein sind, um die Zeichenfolge zu speichern. – jDo

Antwort

1

Ich denke, dies in den Kommentaren gelöst wurde, aber hier ist eine kurze Zusammenfassung:

Einfügen von base64-Strings, die zu lang waren (variable Länge?) in einem varchar (255) -Feld führte zu fehlenden Daten. Soweit ich das beurteilen kann, hat die Vergrößerung des Feldes das unmittelbare Problem gelöst. Ich verwende den Begriff "unmittelbar", weil, wie @ YvesLeBorg in den Kommentaren darauf hingewiesen hat, dies irgendwann ohne Eingabegrößenbeschränkungen im Backend fehlschlagen wird.

Zusätzlich konnte ich nicht ignorieren, dass der PHP/SQL-Code für Injektionen weit offen war.

Es ist gefährlich, $mst_customer = trim($_POST['mst_customer']); an "INSERT INTO ticket_items SET mst_customer = '$mst_customer' zu übergeben und dann über mysql_query($sql) or die(mysql_error()); auszuführen ist gefährlich!

Jeder könnte irgendetwas in den $_POST Parameter schreiben und SQL würde es gerne akzeptieren. Vorbereitete Anweisungen, PDO, Eingabebereinigung usw. gibt es aus einem bestimmten Grund.

Schließlich gab es ein Problem in Bezug auf verschwindende + Zeichen in den Base64-Daten. Dies war das Ergebnis der fehlenden url encoding der Post-Daten.

Ich denke, das fasst es zusammen.

Verwandte Themen