Подтвердить что ты не робот

Как создать объект File из Blob?

DataTransferItemList.add позволяет переопределить операцию копирования в javascript. Он, однако, принимает только объект File.

Копировать событие

Код в моем copy событии:

var items = (event.clipboardData || event.originalEvent.clipboardData);
var files = items.items || items.files;

if(files) {
  var blob = Blob.fromDataURL(_this.editor.selection.getSelectedImage().toDataURL("image/png"));
  files.add(blob);
}

Ошибка в хроме:

Uncaught TypeError: Не удалось выполнить add on DataTransferItemList: параметр 1 не имеет тип File.

Попытка new File(Blob blob, DOMString name)

В Google Chrome я пробовал это, в соответствии с текущей спецификацией:

var blob = Blob.fromDataURL(_this.editor.selection.getSelectedImage().toDataURL("image/png"));  
var file = new File(blob, "image.png");

Проблема заключается в том, что Google Chrome не придерживается спецификаций.

Uncaught TypeError: Не удалось создать File: Незаконный конструктор

В этом случае Firefox также не работает:

Параметр метода отсутствует или недействителен.

Попытка new File([Mixed blobParts], DOMString name, BlobPropertyBag options)

Решение, предлагаемое @apsillers, также не работает. Это нестандартный метод, используемый (но бесполезный) как в Firefox, так и Chrome.

Двоичные данные

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

  //Canvas to binary
  var data = atob(   //atob (array to binary) converts base64 string to binary string
    _this.editor.selection.getSelectedImage()  //Canvas
    .toDataURL("image/png")                    //Base64 URI
    .split(',')[1]                             //Base64 code
  );
  var file = new File([data], "image.png", {type:"image/png"}); //ERROR

Вы можете попробовать это в консоли:

Chrome < 38:
google chrome is retarded Chrome >= 38:
google chrome not retarded anymore Firefox: firefox firebug fileAPI

Blob

Передача Blob, вероятно, правильная и работает в Firefox:

var file = new File([new Blob()], "image.png", {type:"image/png"});

Firefox:
Firefox firebug
Chrome < 38:
google chrome is retarded
Chrome >= 38:
google chrome not retarded anymore

  • Q:. Как я могу сделать File из Blob?

Примечание. Я добавил больше скриншотов после того, как @apsillers напомнили мне об обновлении Google Chrome.

4b9b3361

Ответ 1

Конструктор файла (а также конструктор Blob) принимает массив частей. Часть не должна быть DOMString. Это может быть также Blob, File или типизированный массив. Вы можете легко создать файл из Blob следующим образом:

new File([blob], "filename")

Пожалуйста, воздержитесь от заявления о том, что браузеры не реализуют спецификацию или что спецификация бесполезна, если вы не нашли времени для понимания процесса спецификации или самой спецификации.

Ответ 2

это работает со мной, от холста до файла [или Blob], с именем файла!

var dataUrl = canvas.toDataURL('image/jpeg');
var bytes = dataUrl.split(',')[0].indexOf('base64') >= 0 ?
          atob(dataUrl.split(',')[1]) :
          (<any>window).unescape(dataUrl.split(',')[1]);
var mime = dataUrl.split(',')[0].split(':')[1].split(';')[0];
var max = bytes.length;
var ia = new Uint8Array(max);
for (var i = 0; i < max; i++) {
  ia[i] = bytes.charCodeAt(i);
}

var newImageFileFromCanvas = new File([ia], 'fileName.jpg', { type: mime });

Или, если хотите, блоб

var blob = new Blob([ia], { type: mime });