我正在使用Cordova开发针对Windows和Android的混合应用程序。我正在使用resolveLocalFileSystemURL从磁盘加载文件。在控制台上,根据Windows,创建的文件实际上似乎不是文件:
[对象对象] {结束:380943,lastModified:日期,lastModifiedDate:日期,localURL:“ cdvfile:// l ...”,名称:“ photo.png”,大小:380943,开始:0,类型:“ .png”}
将其与通过这样的输入控件打开的相同文件进行比较:
<input type="file" id="files" name="file"/>
[目标文件] {lastModifiedDate:日期,名称:“ photo.png”,大小:380943,类型:“ image / png”,webkitRelativePath:“”}
在Android上,控制台都将两者都报告为“文件”类型,因此这似乎与Windows实施有关。
我遇到的问题是,当我尝试将文件从磁盘上传到Azure blob存储时,在Windows上失败。如果我直接从输入控件中使用文件,则它在Windows上有效。它适用于Android上的两种文件对象。我认为失败是因为从磁盘读取的文件不是真实文件,因此控制台报告[object Object]而不是[object File]。如何在Windows中从磁盘读取文件,使其确实是文件并成功上传?
这是一个测试功能,用于演示从磁盘读取同一文件或使用输入控件读取同一文件时文件对象之间的差异。使用Windows,每个文件的控制台输出都不同。使用Android也是一样。
<input type="file" id="files" name="file"/>
function loadFile() {
window.resolveLocalFileSystemURL(deviceStorageDirectory + "photo.png", function (oFile) {
console.log(oFile);
oFile.file(function (file1) {
console.log(file1);
var files = document.getElementById('files').files;
var file2 = files[0];
console.log(file2);
});
});}
下面是完整代码。 saveFile()允许用户选择一个文件,并将其保存在临时区域中以供以后上载。 uploadBlobByStream读取并上传保存的文件。
uploadBlobByStream(2)使用输入控件中的文件并工作。 uploadBlobByStream(1)使用从磁盘读取的临时文件,并且在Windows上失败。
导致错误的命令是blobService.createBlockBlobFromBrowserFile,错误是“成功时出现错误callbackId:File1586700476:a:无效的HTML File对象。cordova.js(312,13)”
<input type="file" id="files" name="file"/>
function saveFile() {
var files = document.getElementById('files').files;
var file = files[0];
var myReader = new FileReader();
myReader.onloadend = function (evt) {
var file2 = dataURItoBlob(evt.target.result);
writeLocalFile(deviceStorageDirectory, "photo.png", file2);
};
myReader.readAsDataURL(file);}
function uploadBlobByStream(fileChoice) {
window.resolveLocalFileSystemURL(deviceStorageDirectory + "photo.png", function (oFile) {
oFile.file(function (file1) {
console.log( file1);
var files = document.getElementById('files').files;
var file2 = files[0];
console.log(file2);
if (fileChoice === 1) {
fileToUse = file1;
}
else { fileToUse = file2; }
//the two lines below didn't help:
fileToUse.type = "image/png";
fileToUse.webkitRelativePath= "";
var blobService = getBlobService();
if (!blobService)
return;
var blockSize = fileToUse.size > 1024 * 1024 * 32 ? 1024 * 1024 * 4 : 1024 * 512;
var options = {
storeBlobContentMD5: false,
blockSize: blockSize
};
blobService.singleBlobPutThresholdInBytes = blockSize;
blobService.createBlockBlobFromBrowserFile(container, fileToUse.name, fileToUse, options, function (error, result, response) {
if (error) {
console.log(error);
} else {
console.log("success");
}
});
});
});}
function getBlobService() {
blobUri = 'https://' + account + '.blob.core.windows.net';
var blobService = AzureStorage.Blob.createBlobServiceWithSas(blobUri, sas).withFilter(new AzureStorage.Blob.ExponentialRetryPolicyFilter());
return blobService;
}