Cordova resolLocalFileSystemURL не возвращает файловый объект в Windows - PullRequest
0 голосов
/ 07 декабря 2018

Я занимаюсь разработкой гибридного приложения с использованием 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;
}
...