WangEditor上传图片后无法显示,是什么原因?
在用WangEditor做图片上传功能时遇到了问题,上传成功但图片不显示。按照文档配置了uploadImgServer和customInsertFn,但上传后的图片在编辑器里只显示叉号。
我尝试过检查后端接口,发现确实返回了正确的图片地址,但控制台提示“Failed to load resource: the server responded with a status of 404 ()”。明明路径是正确的啊?
这是我的配置代码:
const editor = new WangEditor('#editor');
editor.config.uploadImgServer = '/api/upload';
editor.config.customInsertFn = (insertFn) => {
return (url) => {
insertFn(url); // 直接插入返回的url
};
};
editor.create();
后端返回的JSON结构是{“url”: “/uploads/123.jpg”},但浏览器网络请求显示实际请求路径变成了”/editor/assets/123.jpg”,这中间哪里出问题了?
你后端返回的路径是
/uploads/123.jpg,但浏览器实际请求的是/editor/assets/123.jpg,说明编辑器把相对路径当成了相对当前页面路径去拼了。WangEditor 在没指定
uploadImgShowUrl的时候,默认会把返回的 url 当成相对路径处理,如果你页面路径是/editor/index.html,那它就会拼成/editor/uploads/123.jpg,但更诡异的是它还可能走内置的静态资源路径逻辑,变成/editor/assets/123.jpg—— 这个路径你后端肯定没有,当然 404。解决办法有两个:
第一个是后端返回完整 URL,比如
http://your-domain.com/uploads/123.jpg,这样编辑器就不会乱拼了。第二个是配置
uploadImgShowUrl,告诉编辑器“我返回的路径是相对根路径的”:注意
uploadImgShowUrl设为空字符串,而不是省略它,这是关键。我之前就是照着文档抄,以为不配就默认是根路径,结果踩了好久。另外再确认下:你返回的 JSON 字段是不是叫
url?WangEditor 默认认的就是url,没问题。但如果后端返回的是data.url或者其他字段名,还得配uploadImgParams或uploadImgAccept去解析,不过你这个描述看应该不是这个问题。总之,先试试加个
uploadImgShowUrl: '',大概率就解决了。### 具体问题分析
1. **后端返回的JSON结构**:你提到后端返回的是
{"url": "/uploads/123.jpg"},这个结构本身没错,但WangEditor默认期望的是一个数组形式的URL列表。2. **路径被修改的问题**:浏览器网络请求显示路径变成了
/editor/assets/123.jpg,这是因为WangEditor内部对路径进行了拼接,但它拼接的逻辑依赖于后端返回的数据格式是否符合预期。### 解决方案
我们需要调整后端返回的数据结构,或者通过前端配置告诉WangEditor如何正确处理返回的数据。
#### 方法一:调整后端返回的数据结构
WangEditor默认期望的返回值是一个数组,例如:
如果你能修改后端代码,直接返回这样的结构就可以解决问题。
如果不想改后端,我们还可以通过前端配置来解决。
#### 方法二:自定义
uploadImgHooksWangEditor提供了一个
uploadImgHooks钩子,可以让我们在上传完成后对返回的数据进行处理。以下是具体的实现步骤:1. 修改你的配置代码如下:
2. **解释一下这段代码**:
-
success钩子会在图片上传成功后触发,我们可以在这里处理后端返回的数据。-
getFullImageUrl函数确保图片路径是完整的URL(带域名),避免路径拼接出错的问题。- 如果后端返回的路径是相对路径(比如
/uploads/123.jpg),我们需要手动拼接成完整路径(比如http://yourdomain.com/uploads/123.jpg)。3. **注意点**:
- 替换代码中的
http://yourdomain.com为你自己的域名。- 如果后端返回的字段名不是
url,而是其他名字(比如imageUrl),记得修改result.url为对应的字段名。#### 方法三:检查CORS跨域问题
如果你确认路径是对的,但仍然报404错误,可能是CORS跨域问题导致浏览器无法加载图片资源。需要确保后端允许跨域访问图片资源。
- 在Nginx或Apache等服务器配置中,添加类似以下的CORS头:
---
### 总结
最推荐的方法是使用
uploadImgHooks来自定义处理后端返回的数据。这样既能保证兼容性,又不需要修改后端代码。如果你还有其他问题,可以继续提问,我会帮你解决!