正确预览图片需用filereader读取files[0]为data url并赋值img.src,提交时用formdata.append()传file对象,后端字段名须与前端一致,移动端需处理exif旋转。

选择文件后立即预览图片的正确方式
直接读取 input[type="file"] 的 files 属性,用 FileReader 解析为 data URL,再赋值给 <img> 的 src。不能用 URL.createObjectURL() 后不释放引用,否则内存泄漏风险高。
常见错误是监听 change 事件但没检查 files.length,用户取消选择时 files 为空数组,直接调用 files[0] 会报 Cannot read property 'type' of undefined。
- 只处理第一个文件:
const file = e.target.files[0]; if (!file || !file.type.startsWith('image/')) return; - 用
readAsDataURL,不是readAsText或readAsArrayBuffer - 预览前清空旧
src,避免上次残留:imgEl.src = '';
表单提交时如何同时传图片和其他字段
必须用 FormData 构造请求体,不能靠 enctype="multipart/form-data" 自动处理 —— HTML 表单原生提交会刷新页面,且无法在提交前校验或追加字段。
典型场景:用户填了标题、描述,又选了图片,点击“提交”按钮后上传到后端接口。
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 创建
FormData实例:const fd = new FormData(); - 手动 append 字段:
fd.append('title', titleInput.value); fd.append('image', file); -
file必须是File对象(来自input.files[0]),不是 data URL 或 base64 字符串 - 用
fetch提交:fetch('/api/upload', { method: 'POST', body: fd }),注意不要设Content-Type头,让浏览器自动设置带 boundary
后端接收不到图片的几个关键原因
前端看似正常提交,但后端 req.files 或 request.FILES 为空,大概率是字段名不一致或中间件未启用。
比如前端 fd.append('avatar', file),后端却在找 image 字段;或者 Express 没配 multer,Koa 没用 @koa/multer,Django 没开 FILE_UPLOAD_HANDLERS。
- 确认前后端字段名完全一致:
fd.append('photo', file)→ 后端解析photo字段 - Node.js + Express:必须用
multer.single('photo'),且路由 handler 要写成router.post('/upload', upload, handler) - 如果后端返回 400 且提示 “Multipart: Boundary not found”,说明请求头被手动覆盖,删掉
headers: {'Content-Type': '...'}
移动端拍照后预览模糊或旋转异常
iOS Safari 和部分安卓 WebView 会对 JPEG 图片自动添加 EXIF 旋转信息,但 <img> 渲染时不识别,导致竖拍照片横着显示;另外直接缩放原始大图会导致 canvas 绘制模糊。
这不是前端 bug,是浏览器行为差异,必须用 exif-js 或原生 createImageBitmap(较新)提取 orientation 并手动旋转 canvas。
- 简单兼容方案:用
<img crossorigin="anonymous">+ CSSimage-orientation: from-image(仅 Chrome 82+、Safari 16.4+ 支持) - 通用方案:用
EXIF.getData()读取Orientation,再用 canvas 绘制修正后的图像 - 预览图建议限制尺寸:
canvas.width = 320; canvas.height = 240;,避免大图拖慢渲染
onloadend 和 onerror 分离处理 —— 预览失败时没给用户反馈,还以为功能坏了。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










