wangEditor 5文件上传全攻略:图片/视频/附件上传配置详解
【免费下载链接】wangEditor 项目地址: https://gitcode.com/gh_mirrors/wan/wangEditor
在现代Web应用开发中,富文本编辑器的文件上传功能是内容创作的核心需求之一。wangEditor 5作为一款轻量高效的开源富文本编辑器,提供了完善的文件上传解决方案,支持图片、视频等多种媒体类型。本文将从实际应用场景出发,详细讲解wangEditor 5的文件上传机制、核心配置项及高级功能实现,帮助开发者快速解决文件上传中的常见问题。
上传模块架构解析
wangEditor 5采用模块化设计理念,将文件上传功能封装为独立模块,便于按需集成和扩展。核心上传模块包括图片上传模块和视频上传模块,分别对应upload-image-module和video-module两个独立包。
图片上传核心模块
图片上传功能由upload-image-module提供,其核心实现位于packages/upload-image-module/src/module/index.ts。该模块通过注册菜单配置和编辑器插件的方式集成到wangEditor主框架中:
import { IModuleConf } from '@wangeditor/core'
import withUploadImage from './plugin'
import { uploadImageMenuConf } from './menu/index'
const uploadImage: Partial<IModuleConf> = {
menus: [uploadImageMenuConf], // 注册上传菜单
editorPlugin: withUploadImage, // 注册编辑器插件
}
export default uploadImage
视频上传核心模块
视频上传功能由video-module提供,其菜单配置定义在packages/video-module/src/module/menu/index.ts。该模块支持插入视频和上传视频两种操作,并提供视频尺寸编辑功能:
export const insertVideoMenuConf = {
key: 'insertVideo',
factory() { return new InsertVideoMenu() },
config: genInsertVideoMenuConfig(),
}
export const uploadVideoMenuConf = {
key: 'uploadVideo',
factory() { return new UploadVideoMenu() },
config: genUploadVideoMenuConfig(),
}
export const editorVideSizeMenuConf = {
key: 'editVideoSize',
factory() { return new EditorVideoSizeMenu() },
}
快速上手:基础上传配置
wangEditor 5的文件上传配置遵循统一的API设计,通过editorConfig.MENU_CONF对象进行配置。无论是图片还是视频上传,都支持服务器地址、请求头、超时时间等基础参数设置。
图片上传基础配置
官方提供了完整的图片上传示例页面packages/editor/examples/upload-image.html,展示了最基础的上传配置方式:
const editorConfig = { MENU_CONF: {} }
// 配置图片上传
editorConfig.MENU_CONF['uploadImage'] = {
server: 'http://127.0.0.1:3000/api/upload-img', // 后端上传接口
timeout: 5 * 1000, // 超时时间
fieldName: 'custom-fileName', // 文件上传字段名
meta: { token: 'xxx', a: 100 }, // 额外上传参数
headers: { Accept: 'text/x-json' }, // 请求头
maxFileSize: 10 * 1024 * 1024, // 文件大小限制,10M
}
// 创建编辑器
const editor = E.createEditor({
selector: '#editor-text-area',
html: '<p>Upload image...</p>',
config: editorConfig
})
视频上传基础配置
视频上传配置与图片上传类似,通过uploadVideo键进行配置,官方示例见packages/editor/examples/upload-video.html:
editorConfig.MENU_CONF['uploadVideo'] = {
server: 'http://127.0.0.1:3000/api/upload-video', // 视频上传接口
timeout: 5 * 1000, // 超时时间
fieldName: 'custom-fileName', // 文件上传字段名
maxFileSize: 10 * 1024 * 1024, // 10M大小限制
// 更多配置项...
}
深度配置:高级功能实现
wangEditor 5提供了丰富的钩子函数和自定义选项,支持文件过滤、进度显示、错误处理等高级功能,满足复杂业务场景需求。
文件上传生命周期钩子
上传模块提供了完整的生命周期钩子,允许开发者在上传的各个阶段进行干预:
editorConfig.MENU_CONF['uploadImage'] = {
// 上传前校验
onBeforeUpload(file) {
console.log('上传前校验', file)
// 验证文件类型
if (!['image/jpeg', 'image/png'].includes(file.type)) {
alert('仅支持jpg/png格式图片')
return false // 阻止上传
}
return file // 允许上传
},
// 上传进度
onProgress(progress) {
console.log('上传进度', progress)
// 更新进度条UI
},
// 上传成功
onSuccess(file, res) {
console.log('上传成功', file, res)
},
// 上传失败
onFailed(file, res) {
console.log('上传失败', file, res)
},
// 上传错误
onError(file, err, res) {
console.error('上传错误', file, err, res)
},
}
自定义上传逻辑
对于需要特殊上传逻辑的场景(如断点续传、云存储直传等),wangEditor 5提供了customUpload选项,允许完全自定义上传过程:
editorConfig.MENU_CONF['uploadImage'] = {
customUpload(file, insertFn) {
return new Promise((resolve) => {
// 1. 创建FormData
const formData = new FormData()
formData.append('file', file)
formData.append('token', getAuthToken())
// 2. 自定义上传请求
fetch('https://your-custom-upload-api.com', {
method: 'POST',
body: formData,
})
.then(response => response.json())
.then(data => {
// 3. 上传成功后插入图片
insertFn(data.url, data.alt, data.href)
resolve('上传完成')
})
})
},
}
自定义文件选择与上传
如果需要完全控制文件选择和上传流程(如集成第三方云存储选择器),可以使用customBrowseAndUpload选项:
editorConfig.MENU_CONF['uploadImage'] = {
customBrowseAndUpload(insertFn) {
// 调用第三方文件选择器
thirdPartyFilePicker.open({
success: (files) => {
// 文件上传逻辑
uploadToCloud(files[0]).then(result => {
// 插入图片
insertFn(result.url, result.name, result.url)
})
}
})
},
}
常见问题解决方案
在实际开发中,文件上传可能会遇到各种问题,本节总结了常见问题及解决方案。
跨域问题处理
当编辑器页面与上传接口不在同一域名下时,需要配置CORS(跨域资源共享)。服务器端需要设置允许跨域请求的响应头:
Access-Control-Allow-Origin: https://your-editor-domain.com
Access-Control-Allow-Methods: POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, Authorization
同时在wangEditor配置中添加必要的请求头:
editorConfig.MENU_CONF['uploadImage'] = {
headers: {
'Authorization': 'Bearer ' + getToken(),
'X-Requested-With': 'XMLHttpRequest'
},
// 其他配置...
}
大文件上传优化
对于大文件上传,可以通过分片上传和断点续传提升用户体验。结合customUpload实现分片上传:
editorConfig.MENU_CONF['uploadVideo'] = {
maxFileSize: 500 * 1024 * 1024, // 支持最大500M视频
customUpload(file, insertFn) {
return new Promise((resolve) => {
// 使用分片上传库如resumable.js
const resumable = new Resumable({
target: 'https://your-upload-api.com/chunk',
chunkSize: 1 * 1024 * 1024, // 1MB分片
simultaneousUploads: 3, // 3个并发上传
})
resumable.addFile(file)
resumable.on('complete', () => {
fetch('https://your-upload-api.com/complete', {
method: 'POST',
body: JSON.stringify({ filename: file.name })
})
.then(response => response.json())
.then(data => {
insertFn(data.url, data.poster)
resolve()
})
})
resumable.upload()
})
},
}
上传安全策略
为保证上传安全,建议采取以下措施:
- 文件类型验证:服务端验证文件MIME类型和文件扩展名
- 文件大小限制:通过
maxFileSize限制上传文件大小 - 文件内容验证:服务端对文件内容进行扫描,防止恶意文件
- 鉴权与授权:使用
meta或headers传递认证信息 - 文件名处理:服务端对上传文件名进行重命名,避免路径遍历攻击
editorConfig.MENU_CONF['uploadImage'] = {
meta: {
token: getAuthToken(), // 传递认证令牌
timestamp: Date.now(),
sign: generateSign() // 生成签名防止请求篡改
},
metaWithUrl: false, // 将meta参数放在请求体中而非URL
// 其他配置...
}
示例代码与项目资源
wangEditor官方提供了丰富的示例代码和项目资源,帮助开发者快速集成文件上传功能。
完整示例页面
项目文档与资源
- 官方文档:docs/
- 核心源码:packages/core/
- 模块测试用例:packages/upload-image-module/tests/
总结与最佳实践
wangEditor 5的文件上传功能提供了灵活而强大的API,能够满足大多数Web应用的富文本编辑需求。在实际项目中,建议:
- 按需配置:仅配置项目所需的上传参数,避免冗余配置
- 错误处理:完善的错误处理机制提升用户体验
- 安全优先:始终在服务端进行文件验证和处理
- 渐进增强:基础上传功能满足大部分场景,复杂场景使用自定义上传
- 性能优化:大文件采用分片上传,小文件可考虑base64直接插入
通过本文介绍的配置方法和最佳实践,开发者可以快速实现安全、高效的文件上传功能,为用户提供流畅的内容创作体验。如需进一步定制,可以参考项目源码中的模块实现,或通过社区寻求帮助。
【免费下载链接】wangEditor 项目地址: https://gitcode.com/gh_mirrors/wan/wangEditor
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



