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

Как создать измененную копию объекта File в JavaScript?

Свойства файлов, полученных из <input type="file">, доступны только для чтения.

Например, следующая попытка перезаписать file.name либо сработает молча, либо отбросит TypeError: Cannot assign to read only property 'name' of object '#<File>'.

<input onchange="onchange" type="file">
onchange = (event) => {
    const file = event.target.files[0];
    file.name = 'foo';
}

Попытка создать копию с помощью Object.assign({}, file) завершается с ошибкой (создает пустой объект).

Итак, как клонировать объект File?

4b9b3361

Ответ 1

Мое решение лежит в конструкторе File:

https://developer.mozilla.org/en-US/docs/Web/API/File#Implementation_notes

Какая из них является расширением Blob:

https://developer.mozilla.org/en-US/docs/Web/API/Blob/Blob

let file = event.target.files[0];
if (this.props.distro) {
    const name = 'new-name-here' + // Concat with file extension.
        file.name.substring(file.name.lastIndexOf('.'));
    // Instantiate copy of file, giving it new name.
    file = new File([file], name, { type: file.type });
}

Обратите внимание, что первым аргументом File() должен быть массив, а не только исходный файл.

Ответ 2

Вы можете использовать FormData.prototype.append(), который также преобразует объект Blob в объект File.

let file = event.target.files[0];
let data = new FormData();
data.append("file", file, file.name);
let _file = data.get("file");

Ответ 3

Более кросс-браузерное решение

Принятый ответ также работает для меня в современных браузерах, но, к сожалению, он не работает в IE11, поскольку IE11 не поддерживает конструктор File. Однако IE11 поддерживает конструктор Blob поэтому его можно использовать как альтернативу.

Например:

var newFile  = new Blob([originalFile], {type: originalFile.type});
newFile.name = 'copy-of-'+originalFile.name;
newFile.lastModifiedDate = originalFile.lastModifiedDate;

Источник: MSDN - Как создать экземпляр файла, используя файловый API HTML 5?