抽象chrome打包的应用程序文件系统以与node-webkit一起使用

oconnecp

我目前有一个chrome打包的应用程序,我们也已经移植到了iPad,但是我想使用node-webkit(nw.js)将其安装为可安装的程序,并且我需要抽象该chrome打包的应用程序API以便与chrome.fileSystem一起使用。我当前用于保存的代码如下。

 var downloadFile = function (readUrl, next) {
     var xhr = new XMLHttpRequest();
    xhr.open('GET', readUrl);
     xhr.responseType = 'arraybuffer';

     xhr.onload = function (e) {
         if (this.status == 200) {
             var response = this.response;
            var params = {
                 type : 'saveFile',
                suggestedName : fileNameNoExtension,
                         //my code will inject the extension but in this case i just put in txt
                         accepts : [{
                         extensions : ['.txt']
                     }
                 ]
             }
            chrome.fileSystem.chooseEntry(params, function (writableFileEntry) {
                 debugger;
                writableFileEntry.createWriter(function (writer) {
                     debugger;
                    writer.onwriteend = function (e) {
                         return next(null)
                     };
                    writer.onerror = function (e) {};
                     writer.write(new Blob([response], {
                             type : 'application/octet-stream'
                         }));
                 });
             });

         } else {
             //alert
         }
     };
    xhr.onprogress = function (evt) {
         if (evt.lengthComputable) {
             console.log('progress: ' + Math.round(evt.loaded * 100 / evt.total));
         }
     }
    xhr.addEventListener("error", function () {
         return next('error')
     }, false);
    xhr.addEventListener("abort", function () {
         return next('abort')
     }, false);
    xhr.send();
 }
oconnecp

我创建了一个名为interop.js的文件,并将此脚本加载到index.html中,如果它是nw.js项目,它将处理文件存储的所有Chrome打包应用API调用。如果它是chrome打包的应用,则chrome将处理它自己的API。

 //if process is undefined then it is not an nw.js project and we can ignore the rest of the code;
 if (typeof process == 'undefined') {}
 //this is a nw.js project, spoof the chrome packaged app API
 else {
     var fs = require('fs')
         chrome = new function () {
        var fileSystem = {
             //callback return readableFileEntry, which has a
            chooseEntry : function (params, callback) {
                 if (params.type == 'openFile') {
                     //open file choose
                    chooseFile(params, function (files) {
                         //this is technically an html5 "filelist"  we need to turn it into an array if there is more
                        //than one, and just return the single file if there isn't
                         if (!files) {
                             return callback(null)
                         }
                        async.map(files, function (file, cb) {
                             //normally chrome provides a 'readablefileentry' that will only give you the file
                            //asynchronously using the file() function
                             file.file = function (next) {
                                 return next(this);
                             }
                            cb(null, file)
                         }, function (err, files) {
                             if (files.length > 1) {
                                 return callback(files);
                             } else {
                                 return callback(files[0]);
                             }
                         })
                     })
                 } else if (params.type == 'saveFile') {
                     chooseFile(params, function (files) {
                         var file = files[0];
                        debugger;
                         file.createWriter = function (next) {
                             var writer = {
                                 write : function (blob) {
                                     debugger;
                                    var reader = new FileReader()
                                         reader.readAsArrayBuffer(blob)
                                        reader.addEventListener('loadend', function (e) {
                                             var binary = new Uint8Array(reader.result)
                                                 debugger;
                                             fs.writeFile(file.path, new Buffer(binary), function (err) {
                                                 //if the on error and writeend has been defined then callback, otherwise throw the error and log success
                                                if (err && writer.onerror) {
                                                     writer.onerror(err)
                                                 } else if (err) {
                                                     throw err
                                                 } else if (writer.onwriteend) {
                                                     writer.onwriteend()
                                                 } else {
                                                     console.log('file was written but no callback was defined')
                                                 }
                                             })
                                         });
                                 }
                             }
                            return next(writer)
                         }
                        return callback(file)
                     })
                 }
                function chooseFile(params, next) {
                     var fileHtml = '<input type="file"'
                         debugger;
                     if (params.acceptsMultiple)
                         fileHtml += ' multiple';
                     if (params.accepts && params.accepts.length > 0 && params.accepts[0].extensions) {
                         fileHtml += ' accept="'
                        for (var i = 0; i < params.accepts[0].extensions.length; i++) {
                             if (i != 0)
                                 fileHtml += ','
                                fileHtml += '.' + params.accepts[0].extensions[i]
                         }
                        fileHtml += '"'
                     }
                    if (params.suggestedName) {
                         fileHtml += ' nwsaveas="' + params.suggestedName + '"'
                     }

                     fileHtml += '>'

                     var chooser = $(fileHtml);
                    chooser.change(function (evt) {
                         debugger;
                        return next(chooser[0].files)
                     });

                     chooser.click();
                 }
             }
         }

         return {
             fileSystem : fileSystem,
         }
     };
 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

抽象chrome打包的应用程序文件系统以与node-webkit一起使用

来自分类Dev

试图在Webpack上将mongoose与node-webkit目标一起使用

来自分类Dev

嵌入无法与Node-webkit一起使用的Youtube视频

来自分类Dev

NPAPI Flash插件,可与node-webkit一起使用

来自分类Dev

如何将ejs与node-webkit一起使用

来自分类Dev

如何使用node-webkit中的webpack将节点模块与本机插件捆绑在一起?

来自分类Dev

哪些文件需要与cefsharp winforms应用程序一起打包

来自分类Dev

哪些文件需要与cefsharp winforms应用程序一起打包

来自分类Dev

如何在Rails 4.1应用程序中将基于事件的文件系统侦听器与Spring一起使用

来自分类Dev

将tsUnit与NodeJs应用程序一起使用

来自分类Dev

将RabbitMQ与Ionic应用程序一起使用

来自分类Dev

将AppHarbour与WPF应用程序一起使用

来自分类Dev

将Chroot与Java应用程序一起使用

来自分类Dev

蓝牙信标如何与应用程序一起使用?

来自分类Dev

IdentityServer与企业应用程序一起使用

来自分类Dev

cURL如何与文件一起使用

来自分类Dev

JSON-与Android应用程序一起使用的单个文件

来自分类Dev

如何使Angular 2应用程序与桶文件导入一起使用?

来自分类Dev

将WPF应用程序中的RESX文件与Prism一起使用

来自分类Dev

写入.json文件,它将无法与其他应用程序一起使用

来自分类Dev

使用xdg-open与任何应用程序一起打开文件

来自分类Dev

Chrome打包的应用无法与jquery和jquery mobile一起使用

来自分类Dev

Shopify应用程序-将脚本标签与Ruby on Rails应用程序一起使用

来自分类Dev

Shopify应用程序-将脚本标签与Ruby on Rails应用程序一起使用

来自分类Dev

将Chromecast与打包的Chrome应用程序结合使用

来自分类Dev

与客户端应用程序打包在一起的最佳数据库

来自分类Dev

DLL通常与应用程序打包在一起吗?

来自分类Dev

如何将数据库与应用程序打包在一起?

来自分类Dev

更新如何与从.deb文件安装的程序一起使用

Related 相关文章

  1. 1

    抽象chrome打包的应用程序文件系统以与node-webkit一起使用

  2. 2

    试图在Webpack上将mongoose与node-webkit目标一起使用

  3. 3

    嵌入无法与Node-webkit一起使用的Youtube视频

  4. 4

    NPAPI Flash插件,可与node-webkit一起使用

  5. 5

    如何将ejs与node-webkit一起使用

  6. 6

    如何使用node-webkit中的webpack将节点模块与本机插件捆绑在一起?

  7. 7

    哪些文件需要与cefsharp winforms应用程序一起打包

  8. 8

    哪些文件需要与cefsharp winforms应用程序一起打包

  9. 9

    如何在Rails 4.1应用程序中将基于事件的文件系统侦听器与Spring一起使用

  10. 10

    将tsUnit与NodeJs应用程序一起使用

  11. 11

    将RabbitMQ与Ionic应用程序一起使用

  12. 12

    将AppHarbour与WPF应用程序一起使用

  13. 13

    将Chroot与Java应用程序一起使用

  14. 14

    蓝牙信标如何与应用程序一起使用?

  15. 15

    IdentityServer与企业应用程序一起使用

  16. 16

    cURL如何与文件一起使用

  17. 17

    JSON-与Android应用程序一起使用的单个文件

  18. 18

    如何使Angular 2应用程序与桶文件导入一起使用?

  19. 19

    将WPF应用程序中的RESX文件与Prism一起使用

  20. 20

    写入.json文件,它将无法与其他应用程序一起使用

  21. 21

    使用xdg-open与任何应用程序一起打开文件

  22. 22

    Chrome打包的应用无法与jquery和jquery mobile一起使用

  23. 23

    Shopify应用程序-将脚本标签与Ruby on Rails应用程序一起使用

  24. 24

    Shopify应用程序-将脚本标签与Ruby on Rails应用程序一起使用

  25. 25

    将Chromecast与打包的Chrome应用程序结合使用

  26. 26

    与客户端应用程序打包在一起的最佳数据库

  27. 27

    DLL通常与应用程序打包在一起吗?

  28. 28

    如何将数据库与应用程序打包在一起?

  29. 29

    更新如何与从.deb文件安装的程序一起使用

热门标签

归档