php - 发送到服务器时 Base64 不完整

标签 php swift

我正在尝试将图像发送到服务器,但图像应该是 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());
}

?>

最佳答案

我认为这个问题已在评论中解决,但这里有一个回顾:

在 varchar(255) 字段中插入太长的 Base64 字符串(可变长度?)会导致数据丢失。据我所知,增加领域的规模解决了眼前的问题。我使用术语“立即”,因为正如 @YvesLeBorg 在评论中指出的那样,如果后端没有输入大小限制,这肯定会在某个时候失败。

此外,我无法忽视 PHP/SQL 代码对注入(inject)完全开放的事实。

$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、输入清理等的存在是有原因的。

最后,还有一个关于 Base64 数据中 + 符号消失的问题。这是缺少 url encoding 的结果发布数据。

我认为这就是总结。

关于php - 发送到服务器时 Base64 不完整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36286326/

相关文章:

ios - Swift 3 应用程序中的 performSegue 无法正常工作

arrays - Swift Array Extension 用 n-previous 值的总和替换索引 n 的值

javascript - 使用 HTML 请求从 Javascript 调用 PHP 文件在 xampp 本地服务器上不起作用

php - 两个日期之间的SQL存储逻辑

php cake find() 使用 OR 条件

swift - 在 Swift/SpriteKit 中使用 NSCoding 获取高分和生命周期分数

ios - 如何在 cellForItemAt indexPath 内添加约束

swift - 为什么 Dictionary.map 返回一个元组数组,它​​在哪里记录?

php - 是否有任何 Joomla 方法可以使用单个查询更新多个数据库行?

php - 如何在 PHP 中测试变量是否为原始变量