Как конвертировать Camera Image в blob в ioni c 5? - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу опубликовать данные составной формы, для этого мы можем сделать так:

let formData = new FormData()
formData.append('myfile', 'your blob')

this.http.post(url, formData)

Но я не знаю, как преобразовать изображение с камеры в блоб. Я использую родной плагин камеры, и здесь мой код:

  cameraOptions: CameraOptions = {
    quality: 20,
    destinationType: this.camera.DestinationType.DATA_URL,
    encodingType: this.camera.EncodingType.JPEG,
    mediaType: this.camera.MediaType.PICTURE,
    sourceType: this.camera.PictureSourceType.PHOTOLIBRARY
  }

constructor(public camera: Camera){}

takePhoto() {
    return new Promise(resolve => {
      this.camera.getPicture(this.cameraOptions).then((imageData) => {
        resolve(imageData);
      }, (err) => {
        resolve(err);
      });
    });
  }

Я попробовал этот код для BLOB-объектов:

dataURLtoBlob(dataURL) {
    debugger;
    // convert base64/URLEncoded data component to raw binary data held in a string
    let byteString: string;
    if (dataURL.split(',')[0].indexOf('base64') >= 0) {
      byteString = atob(dataURL.split(',')[1]);
    } else {
      byteString = unescape(dataURL.split(',')[1]);
    }
    // separate out the mime component
    let mimeString = dataURL
      .split(',')[0]
      .split(':')[1]
      .split(';')[0];

    // write the bytes of the string to a typed array
    let ia = new Uint8Array(byteString.length);
    for (let i = 0; i < byteString.length; i++) {
      ia[i] = byteString.charCodeAt(i);
    }

    let blobImg = new Blob([ia], { type: mimeString });
    console.log(blobImg);
    this.blobImage = blobImg;
}

С помощью этого кода я могу получить данные изображения, но как преобразовать в большой двоичный объект, пожалуйста, помогите ...

Здравствуйте @ sergey-rudenko здесь мой вывод

Вывод getPicture:

imageDataURI:  content://com.android.providers.media.documents/document/image%3A78702

выход this.file.resolveLocalFilesystemUrl:

entry:  

FileEntry {isFile: true, isDirectory: false, name: "image:78702", fullPath: "/com.android.providers.media.documents/document/image:78702", filesystem: FileSystem, …}
filesystem: FileSystem {name: "content", root: DirectoryEntry}
fullPath: "/com.android.providers.media.documents/document/image:78702"
isDirectory: false
isFile: true
name: "image:78702"
nativeURL: "content://com.android.providers.media.documents/document/image%3A78702"
__proto__: Entry

выход entry.file:

file:  
File {name: "content", localURL: "cdvfile://localhost/content/com.android.providers.media.documents/document/image%3A78702", type: "image/jpeg", lastModified: 1588099237000, lastModifiedDate: 1588099237000, …}
end: 79807
lastModified: 1588099237000
lastModifiedDate: 1588099237000
localURL: "cdvfile://localhost/content/com.android.providers.media.documents/document/image%3A78702"
name: "content"
size: 79807
start: 0
type: "image/jpeg"
__proto__: Object

вывод const blob:

Blob {size: 79807, type: "image/jpeg"}
size: 79807
type: "image/jpeg"
__proto__: Blob

вывод formData:

FormData {}
__proto__: FormData
append: ƒ append()
  arguments: (...)
  caller: (...)
  length: 2
  name: "append"
  __proto__: ƒ ()
  [[Scopes]]: Scopes[0]
delete: ƒ delete()
entries: ƒ entries()
forEach: ƒ forEach()
get: ƒ ()
getAll: ƒ getAll()
has: ƒ has()
keys: ƒ keys()
set: ƒ ()
values: ƒ values()
constructor: ƒ FormData()
Symbol(Symbol.iterator): ƒ entries()
Symbol(Symbol.toStringTag): "FormData"
__proto__: Object

1 Ответ

1 голос
/ 28 апреля 2020

Для получения блоба вам понадобятся несколько вещей:

Сначала убедитесь, что в настройках плагина Camera задано возвращение FILE_URI (URL-адрес двоичного файла изображения):

  options: CameraOptions = {
    quality: 100,
    destinationType: this.camera.DestinationType.FILE_URI, // set to FILE_URI
    encodingType: this.camera.EncodingType.JPEG,
    mediaType: this.camera.MediaType.PICTURE
  };

Во-вторых, поскольку FILE_URI - это просто ссылка, а не фактический файл, вам нужен способ его получения. Вы можете сделать это, используя плагин File:

// Import it:

  import {File, FileEntry} from '@ionic-native/file/ngx';

// Then use it in the method that Camera plugin has for taking pictures:

  getPicture() {
    this.camera.getPicture(this.options).then((imageDataURI) => {
      this.file.resolveLocalFilesystemUrl(imageDataURI).then((entry: FileEntry) => 
      {
        entry.file(file => {
          console.log(file);
          this.readFile(file);
        });
      });
    }, (err) => {
      // Handle error
    });
  };

Наконец, чтобы отправить его на ваш сервер, вам нужно прочитать файл:

  read(file) {
    const reader = new FileReader();
    reader.onload = () => {
      const blob = new Blob([reader.result], {
        type: file.type
      });
      const formData = new FormData();
      formData.append('name', 'MyImageBlob');
      formData.append('file', blob, file.name);
      this.service.upload(formData).subscribe(response => {
        console.log(response);
      });
    };
    reader.readAsArrayBuffer(file);
  };

Дайте мне знать, если вы можете взять его из здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...