Я занимаюсь разработкой гибридного приложения с использованием Cordova для Windows и Android.Я загружаю файл с диска с помощью resolLocalFileSystemURL.В Windows созданный файл фактически не является файлом, в соответствии с консолью:
[object Object] {end: 380943, lastModified: date, lastModifiedDate: date, localURL: "cdvfile: // l ... ", name:" photo.png ", размер: 380943, start: 0, введите:" .png "}
Сравните это с тем же файлом, открытым с помощью элемента управления вводом, например:
<input type="file" id="files" name="file"/>
[объектный файл] {lastModifiedDate: дата, имя: "photo.png", размер: 380943, тип: "image / png", webkitRelativePath: ""}
Вкл.Android консоль сообщает оба типа «файл», поэтому, похоже, что-то связано с реализацией Windows.
Проблема, с которой я столкнулся, заключается в том, что при попытке загрузить файл с диска в хранилище BLOB-объектов Azure происходит сбойна винде.Это работает на окнах, если я использую файл непосредственно из элемента управления вводом.Он работает с обоими типами файловых объектов на Android.Я предполагаю, что ошибка заключается в том, что файл, считанный с диска, не совсем настоящий файл - следовательно, консоль сообщает [объектный объект], а не [объектный файл].Как я могу прочитать файл с диска в 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. 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;
}