2

В настоящее время у меня есть хром-пакетное приложение, которое мы также портировали на iPad, но я хочу сделать его инсталляционным, используя node-webkit (nw.js) и I необходимо абстрагироваться от хром-пакета API приложения для использования с chrome.fileSystem. Код, который я сейчас использую для сохранения, выглядит следующим образом.Аннотация хром упакованная файловая система приложения для использования с node-webkit

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(); 
} 

ответ

2

Я создал файл, который я называю interop.js я загрузить этот скрипт в мой index.html, и он будет обрабатывать все хромовые упакованы вызовов API приложение для fileStorage если это nw.js проект. Если это хром-пакетное приложение, то хром будет обрабатывать собственный 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, 
     } 
    }; 
}