atom实现上传JSON数据,获取服务器生成文件并下载到本地。

本文介绍如何在Atom编辑器中通过GET请求从服务器下载Word文档,并保存到本地。涉及electron、http和fs模块的使用,包括弹出保存对话框、处理二进制文件及Base64编码。

综述:

使用atom,向服务器发送get请求。生成文件,下载到本地。

 

先看源码

function getDocxFromServer(documentTrees, modalPanel){

    const { dialog } = require('electron').remote;
    let savePath = dialog.showSaveDialog({filters:[{name:'Word', extensions:['docx']}]});
    // 如果已经存在了,会被提示的是否覆盖的。
    console.log(savePath);
    console.log("showOpenDialogEnd");
    if (savePath == undefined){
        return;
    }
    if(savePath.split(".").length == 1){
        // 用户没有添加后缀
        savePath = savePath + ".docx";
    }

    console.log(savePath);
    let suffix = savePath.split(".")[savePath.split(".").length - 1];
    if (suffix !== "docx"){
        console.log(suffix + "   不是docx文件");
        return;
    }

    let http = require('http');
    let postData = JSON.stringify({
        massage:{
            userName: "userName",
            fileSuffix: suffix,
        },
        data: documentTrees
    });

    let options = {
      hostname: 'localhost',
      port: 8080,
      path: '/getDocx',
      method: 'GET',
      headers: {
        'Content-Type': 'application/json; charset=utf-8',
        'Content-Length': Buffer.byteLength(postData)
      }
    };
    let fs = require('fs');
    if (fs.existsSync(savePath)) {
        fs.unlinkSync(savePath); //删除文件
        // console.log(savePath + "   被删除");
    }

    modalPanel.show();
    let chunkString = "";

    let req = http.request(options, (res) => {
      // console.log("请求数据长度" + Buffer.byteLength(postData));
      // console.log(`状态码: ${res.statusCode}`);
      // console.log(`响应头: ${JSON.stringify(res.headers)}`);

      res.setEncoding('utf-8');

      res.on('data', (chunk) => {
          console.log(chunk);
          chunkString += chunk;
      });

      res.on('end', () => {
          // console.log('响应中已无数据。');

          let bufferTemp = new Buffer(chunkString, "base64");
          fs.appendFileSync(savePath, bufferTemp, function(error){
              if(error){console.log('写入失败');}else{console.log('写入成功');}
          });
          modalPanel.hide();

      });
    });

    req.on('error', (e) => {
      // console.error(`请求遇到问题: ${e.message}`);
      modalPanel.hide();
    });


    // 写入数据到请求主体
    req.write(postData);
    req.end();

}

 

 

坑有点多,但踩过来了。

1. 以下代码弹出saveAs窗口(支持win和mac)

    const { dialog } = require('electron').remote;
    let savePath = dialog.showSaveDialog({filters:[{name:'Word', extensions:['docx']}]});

用户选择对号对应文件后,获取到savePath中。对于shouSaveDialog有以下参数可以使用:

2.   调用request发送JSON。

let req = http.request(options, (res) => {

 

3.  写入资源

在使用fs写入文件的时候,不能在on('data')的时候调用,会导致fs抢占资源,文件破损。

对于二进制文件,只能选择Base64编码,在使用二进制直接write时候,会导致不可描述的错误(各种二进制也都不行,所以最后只能采用Base64编码)

 

 

4. 对用户的提醒

我直接将Panel传入该方法了,可以调用Panel来控制atom页面,防止用户继续操作(生成错误数据)。

如下图所示

创建Panel 在 项目名-view.js 中。

然后在activate中 引用

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值