You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改剪贴板获取的File对象文件名?解决只读属性报错

解决File对象文件名无法修改的问题

问题原因

File对象的name属性是只读属性,直接赋值会触发类型错误,这是浏览器API的设计限制,无法直接修改现有File实例的name。

解决方案

基于原文件的二进制数据,创建一个新的File对象,指定新的文件名即可。新File对象会保留原文件的内容和类型,仅替换文件名。

修改后的代码

@HostListener('paste', ['$event'])
onPaste(e: ClipboardEvent) {
  const clipboardData = e.clipboardData || (window as any).clipboardData;
  const items: DataTransferItem[] = Array.from(clipboardData.items);
  let copiedFiles: File[] = [];

  for (let i = 0; i < items.length; i++) {
    const originalFile = items[i].getAsFile();
    if (!originalFile) continue; // 跳过非文件项

    let targetFile: File;
    if (originalFile.name.includes('image')) {
      // 基于原文件创建新File,替换文件名
      targetFile = new File([originalFile], this.getScreenshotFilename(), {
        type: originalFile.type,
        lastModified: originalFile.lastModified
      });
    } else {
      targetFile = originalFile;
    }
    copiedFiles.push(targetFile);
  }

  this.files = this.concat(copiedFiles);
}

private getScreenshotFilename(): string {
  return `Screenshot_${formatDate(new Date(), 'yymmddHHMMss', DATE_LOCALE)}`;
}

关键改动说明

  • 不再直接修改原File的name,而是通过new File()构造函数创建新实例
  • 构造新File时传入原文件的二进制数据数组[originalFile],确保内容不变
  • 保留原文件的type和lastModified属性,保证文件元信息的一致性
  • 增加了!originalFile的判断,避免处理非文件类型的剪贴板内容

内容的提问来源于stack exchange,提问作者Eugene Sukh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 18:22:42