我正在使用元素捕获签名,并将该元素处理为DataURL。之后,我将其通过ajax发布到MS SQL的sqlsrv驱动程序中,并将其插入“图像”数据类型列中。问题是我正在运行它与另一个程序并行,在该程序中捕获系统正在捕获以0xFFD8FF等开头的签名,而我唯一能查看的方法是将它们编码为base64,而DataURL则是另一种格式,并且是“一旦将它们编码为base64,就无法正常工作。
解释的代码是...
Ajax:
n = c(10,20,30,40,50,60,70,80,90,100)
B = 1000 # number of replicates
kHat = Parameters[1] # approx = 2.06786
gammaHat = Parameters[2] # approx = 0.51144
TheoreticalMean = kHat/gammaHat
TheoreticalVariance = kHat/gammaHat^2
PercCoverage = vector("numeric", 10L)
for (i in length(n)){
getCI = function(B, k, gamma, n[i]) {
getM = function(orgData, idx) {
bsM = mean(orgData[idx])
bsS2M = (((n[i]-1) / n[i]) * var(orgData[idx])) / n[i]
c(bsM, bsS2M)
}
F = rgamma(n[i], kHat, gammaHat) # simulated data: original sample
M = mean(F) # M from original sample
S2M = (((n[i]-1)/n[i])*var(F))/n[i] # S^2(M) from original sample
# bootstrap
boots = t(replicate(B, getM(F, sample(seq(along=F), replace=TRUE))))
Mstar = boots[,1] # M* for each replicate
S2Mstar = boots[,2] # S^2*(M) for each replicate
biasM = mean(Mstar)-M # bias of estimator M
# indices for sorted vector of estimates
idx = trunc((B+1)*c(0.05/2,1-0.05/2))
ciPerc = sort(Mstar)[idx] # percentile CI
c(perc=ciPerc)
}
# 1000 bootstraps
Nrep <- 1000 # number of bootstraps
CIs <- t(replicate(Nrep, getCI(B, kHat, gammaHat, n[i])))
# coverage probabilities
PercCoverage[i] = sum((CIs[,"perc1"]<TheoreticalMean) & (CIs[,"perc2"]>TheoreticalMean)) / Nrep
}
Sql:
$.ajax({
url:"cgi-bin/php/post/ticket_signature.php",
data: {
ID : '<?php echo $_GET['ID'];?>',
Signature : $("#signature")[0].toDataURL("image/jpeg").replace('data:image/jpeg;base64,', '')
},
method:"POST",
success:function(code){alert(code);}});
HTML / PHP
sqlsrv_query($database, "INSERT INTO nei.dbo.PDATicketSignature(PDATicketID, Signature, SignatureType) VALUES(?,?,'C');",array($_POST['ID'],$_POST['Signature']));
答案 0 :(得分:0)
从php.net找到:http://php.net/manual/en/function.base64-decode.php
如果要保存从Javascript派生的数据 canvas.toDataURL()函数,您必须将空格转换为加号。 如果不这样做,则解码的数据将被破坏:
<?php
$encodedData = str_replace(' ','+',$encodedData);
$decocedData = base64_decode($encodedData);
?>
真正的解决方法是使用基于数组的参数并设置正确的方向,php的数据类型和ms sql的数据类型。
sqlsrv_query($database, "SET TEXTSIZE 10000000;UPDATE nei.dbo.PDATicketSignature SET PDATicketSignature.Signature = ? WHERE PDATicketSignature.PDATicketID = ?;",array(array($data, SQLSRV_PARAM_IN,
SQLSRV_PHPTYPE_STREAM(SQLSRV_ENC_BINARY),SQLSRV_SQLTYPE_VARBINARY('max')),$_POST['ID']));