2015-01-24 1 views
3

Я использую Cordova 4.2.0 для Android.Ошибка записи файла FileTransfer Cordova (код 1)

У меня есть некоторые проблемы, чтобы получить FileTransfer plugin правильно работать. Я полагаю, что есть ошибка записи

exception:".myApp\/contentImages\/20150110220101.jpg: open failed: ENOENT (No such file or directory)" 

имя файла ранее протестирована и еще не существует:

rootFS.getFile('.myApp/contentImages/'+file,{create:false}, 
    function(){ 
     console.log(file+' already exists'); 
    }, 
    function(error){ 
     console.log(file+" does not exist locally"); 
     console.log("Error #"+error.code); 
     download(file); 
    } 
); 

А вот функция загрузки:

function download (filename){ 
    var localPath = rootFS.fullPath+'/.myApp/contentImages/'+filename; 
    var fileTransfer = new FileTransfer(); 
    fileTransfer.download(
     encodeURI('http://distantApp/contentImages/'+filename), // This file exists 
     localPath, 
     function(entry) { 
      console.log("download complete: " + entry.fullPath); 
     }, 
     function (error) { 
      console.log('download error: ' + error.code + ": "+error.exception+" ; source " + error.source+" ; target " + error.target); 
     } 
    ); 
} 

Что может быть проблемой?

EDIT Код для rootFS

function onDeviceReady(){ 
    window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; 
    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, function(){ 
     console.log("error requesting LocalFileSystem"); 
    }); 
} 
function gotFS(fileSystem) { 
    console.log("got filesystem: "+fileSystem.name); // displays "persistent" 
    console.log(fileSystem.root.fullPath); // displays "/" 
    window.rootFS = fileSystem.root; 
} 
+1

Вы пытались распечатать _localPath_, когда используете его? Это должен быть «cdvfile: // localhost/persistent/path/to/downloads /», и этот путь должен быть доступен для записи. Вы можете проверить доступные для записи пути из [File plugin] (https://github.com/apache/cordova-plugin-file/blob/master/doc/index.md#android-file-system-layout). –

+0

Я думаю, что это хорошая подсказка; Я получаю это: '//. MyApp/contentImages/image.jpg'. Поэтому я вернулся к «rootFS», и я редактировал вопрос. – Yako

+0

Кажется, что модернизация Кордовы подразумевала замену '.fullPath' на' .toURL() '. Теперь я получаю 'файл: /// storage/emulated/0 //. MyApp/contentImages/image.jpg'. – Yako

ответ

10

Проблема была вызвана модернизацией Кордовы из предыдущей версии.

Путь локальных файлов не был идентифицирован надлежащим образом: .fullPath теперь устарел и должен быть заменен на .toURL().

+0

К настоящему времени PhoneGap должен действительно обновить свою документацию. Я потратил часы, пытаясь понять это ... и изменив его на .toURL(), исправил его. Благодарю. –

+0

Отлично, что вы спасли мое время .. –

1

Я думаю, ваша проблема не связана с FileTransfer плагин, но, как вы пытаетесь проверить, существует ли файл.

Глядя здесь: http://www.html5rocks.com/en/tutorials/file/filesystem/ вас мы увидим, что доступ к файлу, его сразу же родитель не существует возбудит исключение:

Внутри функции обратного вызова, мы можем назвать fs.root.getFile() с имя создаваемого файла. Вы можете передать абсолютный или относительный путь, но он должен быть действительным. Например, это ошибка при попытке создать файл, у которого непосредственный родитель не существует.

Мне интересно, существует ли проблема с тем, что родители вашего файла не существуют. В этом случае папки .myapp и contentImages.

+0

Я думаю, что родитель существует. Я удалил каталог 'contentImages', и он был правильно воссоздан. Но вы могли бы быть правы, так как я не вставлял эту часть кода, где каталог создается, если он не существует, и который приводит к функции 'download()'. – Yako