无法获取html5 Canvas签名板提交到数据库

时间:2013-06-10 01:52:12

标签: javascript mysql ajax

所以我一直在寻找一个实际可行的签名捕获脚本,并将签名保存到MySQL,我终于找到了我想要的但是有2个问题。

  1. 我无法弄清楚为什么画布在按下清除按钮时不会清除签名。

  2. 按下保存签名按钮时,它不会将图像提交给MySQL。

  3. 这段代码很老了,我试图联系开发人员,但没有得到回复,所以我希望我能在这里得到一些帮助。

    这是html:

            <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
    
        <head>
        <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
        <title>Signature Pad</title>
        <script type="text/javascript" src="jquery.min.js"></script>
        </head>
        <body>
        <center>
            <fieldset style="width: 435px">
                <br/>
                <br/>
                <div id="signaturePad" style="border: 1px solid #ccc; height: 55px; width: 400px;"></div>
                <br/>
                <button id="clearSig" type="button">Clear Signature</button>&nbsp;
                <button id="saveSig" type="button">Save Signature</button>
                <div id="imgData"></div>
                <div id="imgData"></div>
                <br/>
                <br/>
            </fieldset>
        </center>
        </body>
        </html>
    

    剩下的php和脚本:

        $(document).ready(function () {
        /** Set Canvas Size **/
        var canvasWidth = 400;
        var canvasHeight = 75;
    
        /** IE SUPPORT **/
        var canvasDiv = document.getElementById('signaturePad');
        canvas = document.createElement('canvas');
        canvas.setAttribute('width', canvasWidth);
        canvas.setAttribute('height', canvasHeight);
        canvas.setAttribute('id', 'canvas');
        canvasDiv.appendChild(canvas);
        if (typeof G_vmlCanvasManager != 'undefined') {
            canvas = G_vmlCanvasManager.initElement(canvas);
        }
        context = canvas.getContext("2d");
    
        var clickX = new Array();
        var clickY = new Array();
        var clickDrag = new Array();
        var paint;
    
        /** Redraw the Canvas **/
        function redraw() {
            canvas.width = canvas.width; // Clears the canvas
    
            context.strokeStyle = "#000000";
            context.lineJoin = "miter";
            context.lineWidth = 2;
    
            for (var i = 0; i < clickX.length; i++) {
                context.beginPath();
                if (clickDrag[i] && i) {
                    context.moveTo(clickX[i - 1], clickY[i - 1]);
                } else {
                    context.moveTo(clickX[i] - 1, clickY[i]);
                }
                context.lineTo(clickX[i], clickY[i]);
                context.closePath();
                context.stroke();
            }
        }
    
        /** Save Canvas **/
        $("#saveSig").click(function saveSig() {
            var sigData = canvas.toDataURL("image/png");
            $("#imgData").html('Thank you! Your signature was saved');
            var ajax = XMLHttpRequest();
            ajax.open("POST", 'http://www.your-domain.com/folder/post-html.php');
            ajax.setRequestHeader('Content-Type', 'application/upload');
            ajax.send(sigData);
        });
    
        /** Clear Canvas **/
        function clearSig() {
            clickX = new Array();
            clickY = new Array();
            clickDrag = new Array();
            canvas.width = canvas.width;
            canvas.height = canvas.height;
        }
    
        /**Draw when moving over Canvas **/
        $('#signaturePad').mousemove(function (e) {
            if (paint) {
                addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop, true);
                redraw();
            }
        });
    
        /**Stop Drawing on Mouseup **/
        $('#signaturePad').mouseup(function (e) {
            paint = false;
        });
    
        /** Starting a Click **/
        function addClick(x, y, dragging) {
            clickX.push(x);
            clickY.push(y);
            clickDrag.push(dragging);
        }
    
        $('#signaturePad').mousedown(function (e) {
            var mouseX = e.pageX - this.offsetLeft;
            var mouseY = e.pageY - this.offsetTop;
    
            paint = true;
            addClick(e.pageX - this.offsetLeft, e.pageY - this.offsetTop);
            redraw();
        });
    
    });
    

    MySQL部分:

        <?php
    if (isset($GLOBALS["HTTP_RAW_POST_DATA"]))
    {
    $session_id = $_SERVER['REMOTE_ADDR'];
    // Get the data
    $imageData=$GLOBALS['HTTP_RAW_POST_DATA'];
    
    // Remove the headers (data:,) part.
    // A real application should use them according to needs such as to check image type
    $filteredData=substr($imageData, strpos($imageData, ",")+1);
    
    // Need to decode before saving since the data we received is already base64 encoded
    $unencodedData=base64_decode($filteredData);
    
    //echo "unencodedData".$unencodedData;
    $imageName = "sign_" . rand(5,1000) . rand(1, 10) . rand(10000, 150000) . rand(1500, 100000000) . ".png";
    //Set the absolute path to your folder (i.e. /usr/home/your-domain/your-folder/
    $filepath = "htdocs/alpha/site6/signature/images/" . $imageName;
    
    $fp = fopen("$filepath", 'wb' );
    fwrite( $fp, $unencodedData);
    fclose( $fp );
    
    //Connect to a mySQL database and store the user's information so you can link to it later
    $link = mysql_connect('localhost','root', 'pwd') OR DIE(mysql_error);
    mysql_select_db("trial", $link);
    mysql_query("INSERT INTO customer (`session`, `image_location`) VALUES ('$session_id', '$imageName')") OR DIE(mysql_error());
    mysql_close($link);
    }
    ?>
    

1 个答案:

答案 0 :(得分:2)

我只能给出部分答案,因为我无法帮助PHP部分。

我把代码放在一个jsfiddle中,并在这里进行了一些修正:
http://jsfiddle.net/AbdiasSoftware/M8pzB/

你可以看到清除按钮按我的建议工作(除了我在评论中使用ctx而不是上下文)。

我还从HTML中删除了一个双ID'ed div(imgData)。

明确的功能:

$('#clearSig').click(
    function clearSig() {
        clickX = new Array();
        clickY = new Array();
        clickDrag = new Array();
        context.clearRect(0, 0, canvas.width, canvas.height);
});

我在HTML中添加了一个调试标记,显示现在所有内容都可以发送到服务器。由于我无法测试这部分,我只能建议您从该部分开始调试。

我还为画布中生成的数据网址添加了URI编码,这是必要的。

传输MIME可以是text/plain,而您传输的是字符串。由于您使用jQuery,您可以使用内置函数进行ajax-transfer:
http://api.jquery.com/jQuery.ajax/

在PHP端,然后解码URI,像你一样去除data-url的头部,然后如果你想将它存储为二进制,则对它进行base64解码。请注意,在MySQL中,您需要将其存储为BLOB(不要与HTML5的Blob对象混淆)。