• Django支付宝自动转账功能(一)


    首先说明一下最终实现的效果:===>用户上传excel文件====>网页端显示读取文件并显示预览效果====>上传文件至服务器,服务器后台开始调用接口自动转账===>所有转账信息存储到数据库中,失败信息返回到网页上。

    上一篇已经大致将支付接口实现了,这一篇将介绍如何和Django后台连接起来使用,在项目中使用的是excel文件储存转账信息的,所以我们首先需要了解如何读取Excel文件,然后才是进行转账操作,django则是提供网页服务,接收用户上传excel文件,保存交易信息等等。

    1.网页端的预览:
        
     选择上传文件后需要将文件内容读取并显示出来,方便确认信息是否有误后在上传,这里主要是通过JS读取文件内容,然后再把数据以表格的形式展现出来。这里用到了一个一个xlsx插件

    //文件读取
    <script src="http://oss.sheetjs.com/js-xlsx/xlsx.full.min.js"></script>
    <script>
        /*
        FileReader共有4种读取方法:
        1.readAsArrayBuffer(file):将文件读取为ArrayBuffer。
        2.readAsBinaryString(file):将文件读取为二进制字符串
        3.readAsDataURL(file):将文件读取为Data URL
        4.readAsText(file, [encoding]):将文件读取为文本,encoding缺省值为'UTF-8'
        */
        var wb;//读取完成的数据
        var rABS = false; //是否将文件读取为二进制字符串
    
        function importf(obj) {//导入
            if (!obj.files) {
                return;
            }
            var f = obj.files[0];
            var reader = new FileReader();
            reader.onload = function (e) {
                var data = e.target.result;
                if (rABS) {
                    wb = XLSX.read(btoa(fixdata(data)), {//手动转化
                        type: 'base64'
                    });
                } else {
                    wb = XLSX.read(data, {
                        type: 'binary'
                    });
                }
                //wb.SheetNames[0]是获取Sheets中第一个Sheet的名字
                //wb.Sheets[Sheet名]获取第一个Sheet的数据
                document.getElementById("preview").innerHTML = XLSX.utils.sheet_to_html(wb.Sheets[wb.SheetNames[0]]);
    
            };
            if (rABS) {
                reader.readAsArrayBuffer(f);
            } else {
                reader.readAsBinaryString(f);
            }
        }
    
        function fixdata(data) { //文件流转BinaryString
            var o = "",
                l = 0,
                w = 10240;
            for (; l < data.byteLength / w; ++l) o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w, l * w + w)));
            o += String.fromCharCode.apply(null, new Uint8Array(data.slice(l * w)));
            return o;
        }
    </script>

    HTML部分:

    <form method="post" action="" id="upload_form" enctype="multipart/form-data">
      <div style="height: 40px;">
      <input id="uploadFile" type="file" onchange="importf(this)" style="display: inline-block;"name="payment"/>
       <button id="upload" style="height: 32px">上传文件</button>
      </div>
      <div style="border: 1px solid #3b8fc5;border-radius: 5px;height: 500px;position: relative;overflow: auto;text-align:center;vertical-align: middle;"id="preview">
         <p style="color: #c1c1c1">文件预览</p>
       </div>
    </form>

    最终效果:

    2.Excel文件上传和保存:
       
    通过Ajax提交form表单数据到后台,Ajax操作没什么可说的了,需要注意的是form 的enctype属性值,来看一下W3C上面的介绍


    因此我们在上传文件的时候要用enctype="multipart/form-data"

    前端发送文件了接下来就是后端接收文件了,文件数据会包含在request.FILES里面(注意,只有当request方法为POST并且form 的enctype属性值为multipart/form-data的时候request.FILES才会有数据)
    request.FILES中包含下面几个属性:name(文件名)、size(文件大小)、content_type(文件类型)、read()读取整个文件、chunks()返回一个生成器对象

    file = request.FILES.get('payment', None)
    f = open(file.name, 'wb')
    for chunck in file.chunks():
        f.write(chunck)
    f.close()

        至此文件就保存下来了,文件名就是上传的文件名,路径默认为根路径

    努力成为一名GEEK!
  • 相关阅读:
    nfs-client-provisioner 利用NFS动态提供Kubernetes后端存储卷
    docker-compose简易编写和模板命令
    shell脚本自动过滤尝试多次连接ip并添加到系统黑名单
    Centos 升级glibc 亲测好用
    centos安装Jenkins报错
    centos8 安装docker启动失败
    cenots7 rpm 包升级ssh
    python备份文件(简易)
    Docker 容器基本操作(基础)
    Docker 环境下如何配置你的镜像(基础)
  • 原文地址:https://www.cnblogs.com/FanMLei/p/10501016.html
Copyright © 2020-2023  润新知