2016-03-29 7 views
0

サーバーにイメージを送信しようとしていますが、イメージはBase64形式である必要があります。私はそれを送信するには、この機能を使用しています:サーバーへの送信時にBase64が不完全です

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) 
    } 

sig変数は、私は、文字列が正しいことを確認することができますので、それは私のコンソールに印刷されている、Base64文字列を保持しています。私はpostStringも印刷しています。また、検査の結果、署名がBase64文字列と一致していることも間違いありません。しかし、phpmyadminを開くと、不完全なBase64文字列を持つ画像のフィールドが表示されます。おそらく1/4はちょうどそこにあります。

ここに私のPHPコードは、あなたがそれを見たい場合には、です:

<?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

サーバ側では、本体が正しく 'travelled'($ echo、print、log)$ signatureを期待どおりに見ているかどうかを調べてみてください。はいの場合は、テーブルスキーマで可変長テキストフィールド(b64)に対応できることを確認してください。 – YvesLeBorg

+1

@ YvesLeBorg私のフィールドは 'varchar(255)'です - おそらくこれが原因ですか?代わりにどの程度のサイズを入れるべきですか? –

+0

私はSwiftを知らず、あなたのコードを読まなかったが、私は単に質問しなければならない。あなたのBase64をエンコードするURLはありますか?文字列は '+'、 '='、 '/'で区切られますか?あなたのbase64文字列が常に同じ長さにカットされている場合は、私の質問を無視して、文字列を保持するには小さすぎるかもしれないデータベースフィールドを探します。 – jDo

答えて

1

私はこれはコメントで解決したと思いますが、ここでおさらいです:

長すぎるたbase64で文字列を挿入する(変数長さ?)をvarchar(255)フィールドに入力すると、データが失われました。私が知る限り、現場の大きさを増やすことで直ちに問題は解決しました。 @YvesLeBorgはコメントの中で指摘しているように、バックエンドに入力サイズの制限がないと、ある時点で失敗することになるため、「即時」という言葉を使用します。

さらに、私はPHP/SQLコードが注入に対して広く開いていたという事実を無視できませんでした。

$mst_customer = trim($_POST['mst_customer']);"INSERT INTO ticket_items SET mst_customer = '$mst_customer'に送信してからmysql_query($sql) or die(mysql_error());を実行すると危険です。

誰でも$_POSTパラメータに何かを書き込むことができ、SQLはうれしくそれを受け入れます。プリペアドステートメント、PDO、入力サニタイズなどは理由があります。

最後に、基底データに消失する+記号に関する問題がありました。これは投稿データのurl encodingが見つからなかったためです。

私はそれを要約すると思います。

関連する問題