账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Node.js中的buffer如何和python中的buffer相对应
    38
    0

    我的整个需求可以分解为下面几步:

    step1.Node.js发送Buffer类型数据:

    
            因为Node.js中fs文件系统读取文件后的回掉中均返回的为Buffer类型的数据,
            直接通过queryString会使其数据丢失,故先采用JSON.stringify(chunk)对其进行
            格式化,然后再通过queryString将其通过post发送请求出去。
    

    代码如下:

    var fs = require('fs');
    var http = require("http");
    var queryString = require("querystring")
    
    // var filepath = "登陆注册.png";
    var filepath = "mmp.txt";
    var readSteam = fs.createReadStream(filepath);
    readSteam.on("data",(chunk) => {
        let chunkjson = JSON.stringify(chunk);
        console.log(chunkjson);
        let mydata = {"name":filepath, data: chunkjson};
        doapost(mydata);
    })
    function  doapost(data) {
        let contents = queryString.stringify(data);
        console.log("here");
        console.log(contents);
        let options = {
            host: "localhost",
            path: "/mytestpost/",
            port: 8000,
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Content-Length': contents.length
            }
        };
        let req = http.request(options, function (res) {
            res.on("data", function (chunk) {
            
            });
            res.on("end", function (d) {
                console.log("end")
            });
            res.on("error", function (e) {
                console.log(e);
            })
        });
        req.write(contents);
        req.end();
    }

    step2.Django中通过bson.binary.Binary将其数据二进制化存入mongodb中:

    代码如下

    def mytestpost(request):
        filename = request.POST['name']
        data = request.POST['data']
        # return HttpResponse(data)
        client = pymongo.MongoClient('localhost', 27017)
        db = client.cloudfiledb
        coll = db.image
        coll.save(dict(
            content=bson.binary.Binary(bytes(data)),
            filename='115.txt'
        ))
        return HttpResponse(json.loads(data)["data"])

    step3获取文件,请求该接口直接将该接口的返回chunk数据写入文件:

    代码如下:

    def getFile(request):
        client = pymongo.MongoClient('localhost', 27017)
        db = client.cloudfiledb
        coll = db.image
        data = coll.find_one({'filename':'115.txt'})
        return HttpResponse(data['content'])

    现在的问题是直接按上面的方式操作,写出来的文件内容为:
    (因图片上传不了,我直接把图片内容贴出来)
    {"type":"Buffer","data":[97,98,99,100,228,189,160,229,165,189]}

    可以看出此数据即为上传时读取文件的chunk通过JSON.stringtify后的数据,也即就是bson.binary.Binary(bytes(data))中的data数据,而python中的bytes的构造函数也可接受python中的buffer类型

    //~~~~
    以下是 bytes 的语法:
    class bytes([source[, encoding[, errors]]])
    参数
    如果 source 为整数,则返回一个长度为 source 的初始化数组;
    如果 source 为字符串,则按照指定的 encoding 将字符串转换为字节序列;
    如果 source 为可迭代类型,则元素必须为[0 ,255] 中的整数;
    如果 source 为与 buffer 接口一致的对象,则此对象也可以被用于初始化 bytearray。
    如果没有输入任何参数,默认就是初始化数组为0个元素。
    //~~

    所以现在的问题就转化为如何在python中将Node.js中buffer通过JSON.stringtify的到的数据转化为python中的buffer类型的数据希望各位码友不吝赐教

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版

    回答动态

    师傅被妖怪抓走了:发布了悬赏问题火爆全网的“元宇宙”到底是什么?预计能赚取 1积分收益
    酒后略带风情:发布了悬赏问题Android内存中Graphics与Code占用过高预计能赚取 10积分收益
    扛起拖把扫天下:发布了悬赏问题typescript如何导出接口配置?求解,谢谢!预计能赚取 10积分收益
    发布了悬赏问题Vue 如何改变返回页面的路径?如让B页面只能返回到A页面.预计能赚取 11积分收益
    发布了悬赏问题vue H5移动端;底部bottom固定定位,安卓弹起键盘导致页面变形如何解决?预计能赚取 10积分收益
    发布了悬赏问题请问为什么tomcat8.5 GET请求中文正常,POST请求还需要设置UTF-8.预计能赚取 10积分收益
    发布了悬赏问题vue2.5+ts创建以及引入jq的方法预计能赚取 11积分收益
    情场浪女:发布了悬赏问题import ggplot时报错module 'pandas' has no attribute 'tslib'预计能赚取 10积分收益
    见心书画许老师18753375161:发布了悬赏问题echarts3 legend禁止点击事件,允许悬浮事件预计能赚取 11积分收益
    aa_92cb0bd09f:发布了悬赏问题codewar上的一个问题预计能赚取 11积分收益