JS畫板圖片上傳到服務器Python

上次實驗了圖片上傳方式把客戶端圖片保存到服務器的方法

這次經過實驗實現了畫板圖片直接上傳到服務器並保存的方法

只要驗證了幾個概念

js端:base64傳送,json傳送,XMLHttpRequest,$.ajax(

python後端 接受  request.get_json request.get_data()

 

言歸正傳

環境:mac python3,js  chrome瀏覽器

 

前端 引入jquery

<!DOCTYPE html>
<html lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta charset="UTF-8">
    <!--<script src="https://code.jquery.com/jquery-3.1.1.min.js">-->
    <!--</script>-->
    <script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.js"></script>
    <title>Document</title>
    <style type="text/css">
        canvas {
            border: 1px solid green;
        }
    </style>
</head>
<body>

畫板代碼 簡化處理,本章不對畫板的變幻莫測做說明,只需好最簡單部分

主要知道創建了個一個畫布 canvas = document.getElementById('drawing-board')

<canvas id="drawing-board" width="400" height="300"></canvas>
<script type="text/javascript">
    //創建畫布
    var canvas = document.getElementById('drawing-board');
    var ctx = canvas.getContext('2d');

    //設置當前畫布爲畫筆狀態
    var painting = false;
    var lastPoint = {x: undefined, y: undefined};
    var last = null;

    // 鼠標按下
    canvas.onmousedown = function () {
        // 在鼠標按下後觸發鼠標移動事件
        canvas.onmousemove = move;
    };
    // 鼠標擡起取消鼠標移動的事件
    canvas.onmouseup = function () {
        canvas.onmousemove = null;
        last = null;
    };
    // 鼠標移出畫布時 移動事件也要取消。
    canvas.onmouseout = function () {
        canvas.onmousemove = null;
        last = null;
    };
    // 鼠標移動函數
    function move(e) {
        // console.log(e.offsetX);
        if (last != null) {
            ctx.beginPath();
            ctx.moveTo(last[0], last[1]);
            ctx.lineTo(e.offsetX, e.offsetY);
            ctx.stroke();
        }
        // 第一次觸發這個函數,只做一件事,把當前 鼠標的 x , y 的位置記錄下來
        // 做下一次 線段的 起始點。
        last = [e.offsetX, e.offsetY];
    }
</script>

下面直接保存畫板

有兩種方法:

通過ajax 傳送到後臺對應:request.get_data()  

通過XMLHttpRequest 傳送到後臺對應:request.get_json()

取得畫板的元素轉成base64位
var imgUrl = canvas.toDataURL("image/png");
截取22未開始的字節(把圖片頭部去掉)這個處理在後臺也可以 var imageDataB64 = imgUrl.substring(22);
定義json格式並字節轉換 imgData = {uploadImg:imageDataB64}; var senddata = JSON.stringify(imgData);

<button onclick="canvasSaveToServer()">保存畫板</button>
<script type="text/javascript">
    //保存畫板
    function canvasSaveToServer() {
        var imgUrl = canvas.toDataURL("image/png");
        var imageDataB64 = imgUrl.substring(22);
        alert("savePic" + imageDataB64);

        imgData = {uploadImg:imageDataB64};
        var senddata = JSON.stringify(imgData);

        //通過XMLHttpRequest 傳送到後臺
        var xhr = new XMLHttpRequest();
        xhr.open("POST", "/uploadcanvas", true);
        xhr.setRequestHeader('content-type', 'application/json');
        xhr.send(JSON.stringify(senddata));

        //方法二:通過ajax 傳送到後臺

        // $.ajax({
        //     url: "/uploadcanvas",
        //     type: "POST",
        //     //data: { "uploadImg": imageDataB64},
        //     data:senddata,
        //     async: true,
        //     cashe: false,
        //     contentType: false,
        //     processData: false,
        //     success: function (returndata) {
        //         alert("success!")
        //     },
        //     error: function (returndata) {
        //         alert("上傳失敗!")
        //     }
        // })

    }
</script>

後端代碼:app.py

注意  request.get_data()和request.get_json()的不同,與前端分別對應

from flask import Flask, make_response, jsonify, request
import json
import base64
app = Flask(__name__)

@app.route('/canvasTest')
def canvasTest():
    return app.send_static_file('testCanvas.html')

@app.route('/uploadcanvas', methods=["POST"])
def uploadFromCanvas():
    print('uploadFromCanvas')
    print('request.method =',request.method)
    if request.method == "POST":
        #通過get_data方式
        #recv_data = request.get_data()
        # 通過get_json方式
        recv_data = request.get_json()

        if recv_data is None:
            print("request.get_json() is None")
            recv_data = request.get_data()

        print("recv_data=", recv_data)
        json_re = json.loads(recv_data)
        print("json_re=", json_re)
        imgRes = json_re['uploadImg']
        print("imgRes=",imgRes)

        imgdata = base64.b64decode(imgRes)
        print("imgdata=",imgdata)

        file = open('1.jpg', "wb")
        file.write(imgdata)
        file.close()
        return '<h1>Hello~~~:%s</h1>' % 100


if __name__ == '__main__':
    app.run()

測試 http://127.0.0.1:5000/canvasTest

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章