TinyMCE图片上传拖拽与对话框命名规则不一,能否统一保留原命名逻辑
统一文件上传命名逻辑的落地方案
核心根因
你观察到的blobid+双时间戳格式文件名,本质不是后端生成的,是前端上传链路的逻辑差异导致的:
- 拖拽上传路径下,前端直接从拖拽事件回调中读取到本地文件的原始
File对象,能正确获取到用户电脑上的原始文件名(比如hands.jpeg),再按你后端的规则追加毫秒时间戳完成存储。 - 对话框选文件的上传路径下,前端在处理文件时把选中的
File对象重新封装成了纯Blob实例,Blob对象本身没有携带原始文件名属性,默认会生成blobid+独立时间戳格式的占位名称,在构造上传请求时直接把这个占位名传给了后端,没有透传用户实际选择的原始文件名。
你之前配置的images_reuse_filename: true是富文本编辑器(如TinyMCE)的内置配置,作用是要求编辑器不对用户插入的本地图片做重写操作,本身不会修改Blob对象的默认命名规则,因此无法解决当前问题。
具体实现步骤
- 统一两个上传入口的FormData构造逻辑
不管是拖拽触发还是对话框选文件触发的上传,在构造携带文件的上传请求时,不要直接将封装后的Blob实例直接追加到FormData中,要把从文件对象上读取到的原始文件名作为FormData.append的第三个参数显式传入,覆盖Blob的默认占位名称。
问题写法(会生成blobid格式文件名):
正确写法(能保留原始文件名主体):// 直接追加Blob实例,自动使用Blob自带的blobid默认名 formData.append('upload_image', processedBlob)// 从初始的File对象上读取原始名,显式传入覆盖默认名 // 对话框场景从input.onchange的event.target.files[0].name读取,拖拽场景从drop事件的event.dataTransfer.files[0].name读取 const originalName = selectedFile.name formData.append('upload_image', processedBlob, originalName) - 第三方富文本编辑器场景的额外调整
如果你是在TinyMCE等富文本组件中遇到的这个问题,除了上面的基础逻辑,需要重写编辑器的images_upload_handler上传回调:不要走编辑器默认的Blob上传命名分支,在回调中直接取到编辑器内部存储的原始File对象的文件名,再把带正确文件名的Blob传到你自己的后端上传接口,不要依赖编辑器的默认文件命名规则。 - 后端的兜底兼容逻辑
为了避免前端透传的文件名缺失、格式不符合规则,后端在存储文件前加一层校验:如果接收到的文件名是以blobid开头、或者为空值,就从文件的MIME类型反推通用文件名主体,再按你原本的规则追加毫秒级时间戳生成唯一存储名,避免出现重名或无效文件名的问题。
内容的提问来源于stack exchange,提问作者Doug Lerner
相关产品推荐
相关产品推荐

