2017年5月9日19:25:02
在做在線簽名的時候,到了圖片上傳的時候,使用jquery異步ajax上傳base64的圖片數據的時候,使用默認的方式進行數據傳輸偶爾會出現
生產的圖片只有上半部分,開始以為是jsignature生成圖片的問題,但是吧base64的數據放在js里面的時候,每次都沒問題,才發現是ajax的參數長度有問題
var datapair = $("#signature").jSignature("getData", "image");
var i = new Image();
i.src = "data:" + datapair[0] + "," + datapair[1]; //js版本需要的數據格式
i.image = datapair[1];//php需要數據格式
$.ajax({ url: "/app.php?m={$Think.MODULE_NAME}&a={$Think.ACTION_NAME}", data: { data: i.image, identify: "{$identify}", }, type: 'post', cache: false, success: function (msg) { if (msg.code === 1) { } else { } } });
這就是一般的js傳送數據,但是i.image的是base64格式,長度會非常大,會斷掉,所以出現部分圖片下半截亂碼
使用ajax的json數據傳輸就可以避免這個問題,其實也不僅限於base64圖片字段,其他也可以但是需要使用urlencode只有在傳輸,不然會亂碼
js部分
$.ajax({ url: "/app.php?m={$Think.MODULE_NAME}&a={$Think.ACTION_NAME}", dataType: "json", data: "{\"identify\":\"" + requestTag + "\",\"image_data\":\"" + encodeURIComponent(i.image) + "\"}", type: "post", cache: false, success: function (msg) { if (msg.code === 1) { layer.msg('上傳成功'); } else { layer.msg('上傳失敗,請再次簽名!'); } } });
需要注意下的幾個細節
- contentType: 告訴服務器,我要發什么類型的數據
- dataType:告訴服務器,我要想什么類型的數據,如果沒有指定,那么會自動推斷是返回 XML,還是JSON,還是script,還是String。
- Accept:告訴服務器,能接受什么類
data里面一定是可以正常解析的json格式數據不然,后台不能解析,或者出錯,數據里面的雙引號,最好全部都完成保持,轉義
i.image必須encode,不然接受也可能出問題
后台php接受處理部分
$image_data = json_decode(file_get_contents('php://input'), true); //只能這接收
可能是緩沖區有什么其他拋過來的數據
使用$_POST接收的是一個很奇怪的數據,無法解析的數組,注意是數組不是字符串,所以有點奇怪,還有為什么json數據傳輸不會因為太長而截斷,有時間在測試下
大文件的base64上傳試試,$_GET也是一樣的情況
