我正在尝试将图像发送到服务器,但图像应为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!))¤t_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 :(得分:1)
我认为这在评论中得到了解决,但这是一个回顾:
在varchar(255)字段中插入太长(可变长度?)的base64字符串会导致数据丢失。据我所知,增加场地的大小解决了当前的问题。我使用术语“立即”,因为正如@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,输入消毒等都是有原因的。
最后,有一个问题是在base64数据中消失了+
个符号。这是缺少url encoding帖子数据的结果。
我认为这总结了一下。