Как записать файл в приложение Google Chrome без запроса?

Я возился с бесплатным редактором Chrome Dev Editor на своем Chromebook. Я пытаюсь использовать fileSystem для чтения и записи файлов .txt. Все очень запутано, совсем не так, как в C. Я уже не могу сказать, разрешено ли мне вообще что-то делать, не говоря уже о том, где нужно узнать, как это сделать.

Я думаю, что файлы, которые я вижу с помощью файлов, находятся в песочнице, в которой мне разрешено играть (имеются в виду папки, доступные для приложения?). Корень называется «Загрузки». Разумеется, если я использую все точечные вызовы и аргументы обратного вызова для чтения, как в примерах на сайте developer.chrome.com/apps/filesystem, это работает. Но я должен каждый раз получать приглашение как для чтения, так и для записи.

Еще немного Google придумал этот трюк: (я думаю, что это было здесь, в stackoverflow, на самом деле) вызов chrome.runtime, getPackagedDirectoryEntry, который, кажется, дает мне дескриптор папки моего приложения. Большой! Это все, что мне нужно, чтобы не проходить подсказки. Во всяком случае, для файла чтения.

Но тогда попытка применить тот же трюк к файлу записи не сработала. На самом деле, он не сделал ничего заметного. Никаких ошибок, никаких нареканий. Ничего. Несмотря на то, что файл записи с подсказками работает нормально (поэтому, предположительно, у меня есть разрешения и право на создание BLOB-объектов). Что делать?

Вот мой код:

function test(){
// Samsung 303C Chromebook - Chrome Dev Editor - /Downloads/Daily/main.js

// prompted write

  chrome.fileSystem.chooseEntry({type:'saveFile'},function(a){
    a.createWriter(function(b){
      b.write(new Blob(["Programming fun"],{type:'text/plain'}));
    },function(e){trace.innerText = 'error is ' + e;});
  });

// unprompted read

  chrome.runtime.getPackageDirectoryEntry(function(a){
    a.getFile('text.txt',{},function(b){
      b.file(function(c){
        var d = new FileReader();
        d.onloadend = function(){trace.innerText = this.result;};
        d.readAsText(c);
      });
    });
  });

// unprompted write - why not?

  chrome.runtime.getPackageDirectoryEntry(function(a){
    a.getFile('new.txt',{create:true},function(b){
      b.createWriter(function(c){
        c.write(new Blob(["Miss Manners fan"],{type:'text/plain'}));
      },function(e){trace.innerText = 'error is ' + e;});
    });
  });
}    

person Ian G Coville    schedule 25.08.2015    source источник
comment
Непонятно, что вы подразумеваете под примером кода и не работает.   -  person Xan    schedule 26.08.2015
comment
Да, с примером кода (хотя, пожалуйста, отформатируйте его правильно - все строки должны начинаться с 4 пробелов) понятно, в чем ваша проблема. Я отвечу в ближайшее время.   -  person Xan    schedule 27.08.2015
comment
Кстати, в вашем вопросе больше нет вопроса, только код. Пожалуйста, отредактируйте его правильно - у меня есть готовый ответ, когда вы это сделаете.   -  person Xan    schedule 27.08.2015
comment
Большое спасибо за ваше редактирование! Я вырезал немного лишнего из вопроса, проголосовал за усилия и ответил.   -  person Xan    schedule 27.08.2015


Ответы (2)


Справедливости ради следует отметить, что API файловой системы представляет собой большой беспорядок из обратных вызовов, и вполне разумно утонуть в нем.

Это в настоящее время не задокументировано, но chrome.runtime.getPackageDirectoryEntry возвращает чтение -only DirectoryEntry, и сделать его доступным для записи невозможно (это занесен в черный список).

Вероятно, вы не видите ошибку, потому что она завершается ошибкой на этапе getFile, для которого у вас нет обработчика ошибок.

К сожалению, для приложения Chrome единственная возможность записи в реальную файловую систему — запросить пользователя. Однако вы можете сохранить запись и запросить только один раз.


Если вам не нужно записывать в реальную файловую систему, а нужно только внутреннее хранилище, HTML Вам может помочь API файловой системы (да, он помечен как заброшенный, но Chrome поддерживает его, так как chrome.fileSystem построен на нем).

Расширения дополнительно имеют доступ к chrome.downloads API, который позволяет записывать (но не читать) папку «Загрузки».


P.S. То, что вы видите в приложении «Файлы», — это ваша «настоящая» локальная файловая система в ChromeOS + смонтированные облачные файловые системы (например, Google Диск).

person Xan    schedule 27.08.2015
comment
Большое спасибо! Вы спасли меня от множества расплывчатых предложений по тестированию и чтения неуместных руководств и неполной документации. - person Ian G Coville; 28.08.2015

Вы можете использовать базовый веб-API файловой системы. Сначала добавьте разрешение "unlimitedStorage". Затем скопируйте упакованные файлы в изолированную файловую систему, например:

chrome.runtime.getPackageDirectoryEntry(function(package) {
  package.getMetadata(function(metadata) {
    webkitRequestFileSystem(PERSISTENT, metadata.size, function(filesystem) {
      package.copyTo(filesystem.root)
    })
  })
})
person Daniel Herr    schedule 26.08.2015