Я пытаюсь внедрить Camera в моём ионном приложении. Я успешно смог заставить работать камеру. Я смог сделать снимки и показать их на экране, когда пользователь выбирает сохранить, мне нужно загрузить изображение в бэкэнд-систему через вызов API. API принимает только формат BLOB.
С помощью камеры я могу захватывать изображения как в формате Data URL, так и в формате File URL. Я пытался конвертировать эти форматы в BLOB и с помощью некоторых онлайн-сообщений.
Код для открытия камеры, как показано ниже.
openCamera(){
const options: CameraOptions = {
quality: 50,
destinationType: this.camera.DestinationType.FILE_URI,
encodingType: this.camera.EncodingType.JPEG,
mediaType: this.camera.MediaType.PICTURE,
sourceType:this.camera.PictureSourceType.PHOTOLIBRARY
}
this.camera.getPicture(options).then((imageData) => {
// imageData is either a base64 encoded string or a file URI
// If it's base64 (DATA_URL):
// this.picTaken = 'data:image/jpeg;base64,' + imageData;
// this.blobFormat = this.getbase64toBlob(this.picTaken);
//File URL
this.picTaken = imageData;
this.getFiletoBlob(this.picTaken);
}, (err) => {
// Handle error
});
}
Данные URL для BLOB мой код, как показано ниже. Проблема, с которой я сталкиваюсь с этим кодом, состоит в том, что переменная «blob» содержит только «Размер» и «Тип», в переменной BLOB-объекта нет двоичных данных, когда она возвращается, вот что содержит переменная BLOB-объекта . В этом нет доступных двоичных данных.
getbase64toBlob(base64Data){
let contentType ='image/png';
let sliceSize = 512;
base64Data = base64Data.replace(/data\:image\/(jpeg|jpg|png)\;base64\,/gi,'');
let byteCharacters = atob(base64Data);
let byteArrays = [];
for(let offset = 0; offset < byteCharacters.length; offset += sliceSize){
let slice = byteCharacters.slice(offset, offset+sliceSize);
let byteNumbers = new Array(slice.length);
for(let i=0; i < slice.length; i++){
byteNumbers[i] = slice.charCodeAt(i);
}
let byteArray = new Uint8Array(byteNumbers);
byteArrays.push(byteArray);
}
let blob = new Blob(byteArrays,{type: contentType});
return blob;
}
Поскольку URL-адрес данных не работает, я попытался использовать URL-адрес файла для BLOB-объекта, и код выглядит следующим образом. Элемент управления никогда не достигает "imgBlob.name = 'Test Image';" строка в режиме отладки и без ошибок. Похоже, он ничего не делает. Массив вложений всегда равен 0. Я уже установил кордовый плагин-файл.
if(this.platform.is('android')){
return new Promise((resolve, reject)=>{
window.resolveLocalFileSystemURL(file,(entry) => {
console.log(entry);
entry.file((resFile) => {
console.log(resFile);
var reader = new FileReader();
reader.onloadend = (evt: any) => {
var imgBlob: any = new Blob([evt.target.result],{type:'image/jpeg'});
imgBlob.name = 'Test Image';
attachments.push(imgBlob);
console.log(evt);
resolve(imgBlob);
};
reader.onerror = (e) =>{
console.log('Failed file read:'+e.toString());
reject(e);
};
reader.readAsArrayBuffer(resFile);
});
});
});
}
Пока я тестирую только на Android-устройстве. Не могли бы вы дать совет, где я иду не так.