在MS SQL中将Canvas.toDataURL('image / jpeg)转换为Image DataType

时间:2018-10-04 18:58:12

标签: javascript php html sql-server canvas

我正在使用元素捕获签名,并将该元素处理为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']));

1 个答案:

答案 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']));