File 通过cordova插件文件选择本地文件并通过xhr上传

File 通过cordova插件文件选择本地文件并通过xhr上传,file,cordova,upload,xmlhttprequest,cordova-plugin-file,File,Cordova,Upload,Xmlhttprequest,Cordova Plugin File,在我的cordova应用程序中,用户可以录制一个音频文件(通过媒体插件),然后将其存储在本地文件(cordova.file.dataDirectory)中——这就像一个魔咒 我现在想选择这个文件并通过xhr上传它,但是服务器端的file元素是空的。 我的代码是这样的: window.resolveLocalFileSystemURL( cordova.file.dataDirectory + "" + voiceMediaFilename, function(fileEntr

在我的cordova应用程序中,用户可以录制一个音频文件(通过媒体插件),然后将其存储在本地文件(cordova.file.dataDirectory)中——这就像一个魔咒

我现在想选择这个文件并通过xhr上传它,但是服务器端的file元素是空的。 我的代码是这样的:

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));
    }
  );
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));
});
uploadMedia()函数本身执行xhr请求-该函数之所以有效,是因为我在其他情况下也使用它(例如,用户通过输入类型文件选择文件)。 我假设我错过了一些东西,以便真正选择文件对象,但我真的不知道是什么


谢谢

终于找到了答案——也许这对其他人有帮助

需要以ArrayBuffer(blob)的形式读取文件,才能将此blob添加到FormData对象

以下是我的最终代码:

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

终于明白了——也许这对其他人有帮助

需要以ArrayBuffer(blob)的形式读取文件,才能将此blob添加到FormData对象

以下是我的最终代码:

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