Я использую Angular 5 и эмулятор хранилища Azure.
Я пытаюсь загрузить данные в хранилище Azure прямо из моего приложения Angular. Мой первый шаг к достижению этой цели заключался в этом уроке . Все работает, просто загружая одно изображение. Но когда я пытаюсь загрузить несколько изображений (просто упаковываю их в цикл). Загружается только первое, а иногда и третье. Там никогда не было загружено более двух успешно, и это никогда не загружает последовательные изображения.
, чтобы увидеть проблему, вы можете клонировать этот репозиторий и изменить ввод файла, чтобы разрешить множественное и AppComponent
перенос this.blob
.uploadToBlobStorage(accessToken, event.target.files[0]);
в цикле.
Я попытался вызвать функцию загрузки как часть веб-работника, но файлы не загружены.
Может кто-нибудь посоветовать, в чем может быть проблема и что я мог бы предпринять, чтобы решить мою проблему?
#
EDIT
#
Кажется, что обратные вызовы в некоторой степени являются ответом на мою проблему, но я чувствую, что делаю что-то не так, потому что мой код выглядит немного странно (для меня), и я могу загрузить все изображения, но это не на 100% согласованно. Раз это терпит неудачу (что составляет более 50% времени), я получаю
PUT http://127.0.0.1:10000/devstoreaccount1/mySite/IMG_0593.jpg?mytoken&api-version=2017-07-29 500 (Сервер обнаружил внутреннюю ошибку. Пожалуйста, повторите попытку через некоторое время.)
мой код
export class Photo implements IPhoto {
image: File;
imagePreview: string;
thumb_image: File;
thumb_imagePreview: string;
}
imageUrls(roomImages: Photo[]): void {
const accessToken: IBlobAccessToken = {
sasToken: 'myToken',
blobAccountUrl: 'http://127.0.0.1:10000/devstoreaccount1/',
containerName: 'mySite'
};
for(var index = 0; index < roomImages.length; index ++)
{
this._blob.uploadToBlobStorage(accessToken, roomImages[index].image);
}
}
мой код после редактирования
imageUrls(roomImages: Photo[]): void {
const accessToken: IBlobAccessToken = {
sasToken: 'myToken',
blobAccountUrl: 'http://127.0.0.1:10000/devstoreaccount1/',
containerName: 'mySite'
};
var blob = this._blob;
for(var index = 0; index < roomImages.length; index ++)
{
this.blockingFunction(function() { //called to allow images to be uploaded synchronsly
blob.uploadToBlobStorage(accessToken, roomImages[index].image);
});
}
}
blockingFunction(_callback){
_callback();
}
код из учебника
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';
declare var AzureStorage: any;
export interface IBlobAccessToken {
blobAccountUrl: string;
sasToken: string;
containerName: string;
}
@Injectable()
export class BlobStorageService {
private finishedOrError = false;
uploadToBlobStorage(accessToken: IBlobAccessToken, file: File): Observable<number> {
const progress$ = new Subject<number>();
const speedSummary = this.uploadFile(accessToken, file, progress$);
this.refreshProgress(speedSummary, progress$);
return progress$.asObservable();
}
private uploadFile(accessToken: IBlobAccessToken, file: File, progress$: Subject<number>): any {
const customBlockSize = file.size > 1024 * 1024 * 32 ? 1024 * 1024 * 4 : 1024 * 512;
const blobUri = accessToken.blobAccountUrl;
const blobService = AzureStorage
.createBlobServiceWithSas(blobUri, accessToken.sasToken)
.withFilter(new AzureStorage.ExponentialRetryPolicyFilter());
blobService.singleBlobPutThresholdInBytes = customBlockSize;
return blobService.createBlockBlobFromBrowserFile(
accessToken.containerName,
file.name,
file,
{ blockSize: customBlockSize },
this.callback(progress$, accessToken)
);
}
private refreshProgress(speedSummary: any, progress$: Subject<number>): void {
setTimeout(() => {
if (!this.finishedOrError) {
const progress = speedSummary.getCompletePercent();
progress$.next(progress);
this.refreshProgress(speedSummary, progress$);
}
}, 200);
}
private callback(progress$: Subject<number>, accessToken: IBlobAccessToken): (error, result, response) => void {
return (error, result, response) => {
this.finishedOrError = true;
if (error) {
progress$.error('Error uploading to blob storage: ' + JSON.stringify(accessToken));
} else {
progress$.next(100);
progress$.complete();
}
};
}
}