Выберите локальный файл с помощью cordova-plugin-file и загрузите его через xhr - PullRequest
0 голосов
/ 07 марта 2020

В моем приложении Cordova пользователь может записать аудиофайл (через медиа-плагин), который затем сохраняется в локальном файле (cordova.file.dataDirectory) - это работает как чудо.

Я сейчас Вы хотите выбрать этот файл и загрузить его через xhr, но на стороне сервера элемент файла пуст. Вот как выглядит мой код:

window.resolveLocalFileSystemURL(
    cordova.file.dataDirectory + "" + voiceMediaFilename,  
    function(fileEntry) {
      console.log("resolveLocalFileSystemURL done for " + voiceMediaFilename);
      fileEntry.file(
        function(file){
          console.log("getFile done for " + voiceMediaFilename);
          console.log("file done, starting fd ...");
          var fd = new FormData();
          fd.append("sender", uuid);
          fd.append("receiver", receiver);
          fd.append("timestamp", timestamp);
          fd.append("random", random);
          fd.append("media", file);
          console.log(file);
          console.log("Filesize of audio: " + file.size);
          uploadMedia(fd, user, timestamp, messageTypeOwn, uuid, receiver, msgId);
          voiceMediaFilename = "";
        }, 
        function(err){
          alert("Error getting file");
        }
      );
          },
    function(err){
      alert("Error in resolveLocalFileSystemURL " + JSON.stringify(err));
    }
  );

Функция uploadMedia () сама выполняет запрос xhr - функция работает, потому что я использую его и в других случаях (например, пользователь выбирает файл через файл типа ввода ). Я предполагаю, что мне чего-то не хватает, чтобы действительно выбрать объект файла, но я не знаю, что именно.

Спасибо

1 Ответ

0 голосов
/ 28 марта 2020

Наконец-то разобрался - может быть, это кому-нибудь еще поможет.

Требуется прочитать файл как ArrayBuffer (blob), чтобы иметь возможность добавить этот BLOB-объект в объект FormData.

Вот так выглядит мой окончательный код:

window.resolveLocalFileSystemURL(
cordova.file.dataDirectory + voiceMediaFilename,  
function(fileEntry) {
    fileEntry.file(function(file){
        console.log("getFile done for " + voiceMediaFilename);
        var reader = new FileReader();
        reader.onloadend = function() {
            console.log("reader done, starting fd ...");
            var blob = new Blob([new Uint8Array(this.result)], { type: file.type });
            var fd = new FormData();
            fd.append("sender", uuid);
            fd.append("receiver", receiver);
            fd.append("timestamp", timestamp);
            fd.append("random", random);
            fd.append("type", messageTypeOwn);
            fd.append("duration", audioDuration);
            fd.append("media", blob, voiceMediaFilename);
            uploadMedia(fd, user, timestamp, messageTypeOwn, uuid, receiver, msgId);
            voiceMediaFilename = "";
        };
        reader.readAsArrayBuffer(file);
    }, 
    function(err){
        alert("Error getting file");
    });
},
function(err){
    alert("Error in resolveLocalFileSystemURL " + JSON.stringify(err));
});
...