【问题标题】:NW JS - Download and Save a File from URLNW JS - 从 URL 下载并保存文件
【发布时间】:2015-09-16 11:42:09
【问题描述】:

我最近开始使用 NW.JS 开发桌面应用程序,我需要从 URL (http://someurl.org/file.zip) 下载一个文件,我设法保存了该文件,但它似乎已损坏或格式不正确,我无法打开 zip 或解压。

我正在使用 jQuery 从 Node.JS 下载文件和“fs”模块来保存它。

这里是ajax请求:

module.exports.download = function (jQuery, url) {

    return jQuery.ajax({
        url         : url,
        timeout     : 1000000
    });

};

这是其余的:

$('#btnUpdateClient')
            .click(function () {
                ClientDownload
                    .download($, addresses.CLIENT_URL)
                    .complete(function (xhr, status) {
                        console.log(xhr);
                        fs.writeFile('./files/staClient.zip', xhr.responseText, function (err) {

                            if(err) {
                                alert('error!');
                                console.log(err);
                            } else {
                                alert('file Saved!');
                            }

                        });
                    });
            });

显然缺少某些东西,.zip 文件为 3.8 MB,但当我使用 fs.writeFile() 时,文件最终为 7.3 MB

我对 NW.JS 还很陌生,有什么建议吗?

【问题讨论】:

    标签: jquery node.js node-webkit


    【解决方案1】:

    没关系,我刚刚意识到我什至不需要使用 jQuery,我只是像这样使用 NodeJS:

    $('#btnUpdateClient')
                .click(function () {
    
                    var file = fs.createWriteStream('./files/staClient.zip');
    
                    var request = http.get(addresses.CLIENT_URL, function (response) {
                        response.pipe(file);
                    });
                });
    

    【讨论】:

      【解决方案2】:

      如果下载进度对您很重要,请使用:

      var http = require('http');
      var fs = require('fs');
      
      var req = http.get('http://someurl.org/file.zip', function (res) {
      
          var fileSize = res.headers['content-length'];
          res.setEncoding('binary');
          var a = "";
          res.on('data', function (chunk) {
              a += chunk;
              document.getElementById('percent').innerHTML = Math.round(100*a.length/fileSize) + "";
          });
          res.on('end', function() {
              fs.writeFile('D:\\file.zip', a, 'binary', function (err) {
                  if (err) throw err;
                  console.log('finished');
              });
          });
      });
      

      【讨论】:

      • 只是想为任何遇到大于 260mb 文件的“内存泄漏”问题的人添加注释,a += chunk 方法负责此问题,这是防止内存泄漏(以及最终的应用程序崩溃)的最佳解决方案) 是相反的计算,以a = filesize 开始而不是a = "",以a -= chunk.length 减少并将进度计算更改为各自的逆方法Math.round((1-(a/fileSize))*100)。如果我不进行此更改并按原样使用 Sam 的代码,那么我的应用程序总是崩溃,现在它可以下载 1GB 的成功文件,而不会显着影响内存。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 2019-11-18
      • 2011-01-07
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多