在我的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));
}
);uploadMedia()函数本身执行xhr请求-该函数之所以有效,是因为我还在其他情况下使用它(例如,用户通过输入类型文件选择一个文件)。我假设我为了真正选择文件对象而遗漏了一些东西,但我不知道是什么。
谢谢
发布于 2020-03-28 19:23:26
我终于明白了--也许它能帮助到别人。
为了能够将此ArrayBuffer添加到FormData对象,需要将文件作为Blob (blob)读取。
下面是我的最终代码:
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));
});https://stackoverflow.com/questions/60577767
复制相似问题