загрузить видео в хранилище BLOB-объектов, не работающее в Internet Explorer - PullRequest
0 голосов
/ 05 января 2019

Я хочу загрузить видео в хранилище BLOB-объектов Azure, используя Angular-4, и оно работает во всех браузерах, кроме IE. Я получаю сообщение об ошибке

SCRIPT7002: XMLHttpRequest: ошибка сети 0x80070005, доступ запрещен.

Я использую метод put blob для загрузки видео, вот код для него. Я искал эту ошибку, нашел много решений, но здесь не работала какая-то ссылка, которую я пробовал, но не работал

Запрет кэширования IE11 вызовом GET в Angular 2

Угловая проблема кэширования IE для $ http

  upload(config: UploadConfig) {
    debugger;
    var options = new RequestOptions();
    if (options == null) {
        options = new RequestOptions();
    }

    const state = this.initializeState(config);
    const reader = new FileReader();
    reader.onloadend = (evt: any) => {
        if (evt.target.readyState === 2 && !state.cancelled) {
            debugger;
            const uri = state.fileUrl + '&comp=block&blockid=' + state.blockIds[state.blockIds.length - 1];
            const requestData = evt.target.result;
            options.headers = new Headers();
            const requestData2 = new Uint8Array(evt.target.result);
            options.headers.append('x-ms-blob-type', 'BlockBlob');
            options.headers.append('Content-Type', 'application/octet-stream');

            this.http.put(uri, requestData, options).retryWhen(error => {
                return error
                    .flatMap((error: any) => {
                        if (error.status === 503) {
                            return Observable.of(error.status).delay(1000)
                        }
                        return Observable.throw({ error: 'No retry' });
                    })
                    .take(5)
                    .concat(Observable.throw({ error: 'Sorry, there was an error (after 5 retries)' }));
            })
                .subscribe(elem => {
                    state.bytesUploaded += requestData2.length;
                    const percentComplete = ((state.bytesUploaded / state.file.size) * 100).toFixed(2);
                    if (state.progress) {
                        state.progress();
                    }

                    this.uploadFileInBlocks(reader, state);
                }, err => {
                    this.messageService.showClientSideErrors('Oops something went wrong while uploading, please try again.')

                    this.loaderService.displayBar(false);
                });
        }
    };

    this.uploadFileInBlocks(reader, state);

    return {
        cancel: () => {
            state.cancelled = true;
        }
    };
}

Я отладил этот код и обнаружил, что под строкой кода

 this.http.put(uri, requestData, options).retryWhen(error => {
                return error
                    .flatMap((error: any) => {
                        if (error.status === 503) {
                            return Observable.of(error.status).delay(1000)
                        }
                        return Observable.throw({ error: 'No retry' });
                    })
                    .take(5)
                    .concat(Observable.throw({ error: 'Sorry, there was an error (after 5 retries)' }));
            })

я получаю статус = 0 и в другом браузере работает нормально. в чем проблема? Версия IE-11 Win-10

1 Ответ

0 голосов
/ 11 января 2019

Кажется, вы пытаетесь создавать HTTP-запросы самостоятельно. Почему бы не рассмотреть Azure Storage JavaScript SDK?

https://www.npmjs.com/package/@azure/storage-blob

const browserFile = document.getElementById("fileinput").files[0];
await uploadBrowserDataToBlockBlob(Aborter.none, browserFile, blockBlobURL, {
    blockSize: 4 * 1024 * 1024, // 4MB block size
    parallelism: 20, // 20 concurrency
    progress: ev => console.log(ev)
});
...