微信小程序渲染图片报错:[渲染层网络层错误] Failed to load local image resource
微信小程序渲染图片报错:[渲染层网络层错误] Failed to load local image resource
以上微信小程序无法渲染图片的问题也是试过了以下好几种方法,始终没有找到,最后无奈之下找了老师学姐来答疑问题终于知道在哪里了,借鉴了很多其他文章的一些方法也没有用也许是我没有用对,以至于我的解决方法仅供大家参考,同样不一定都能完美解决,但希望能帮助到大家。
以下是我尝试过失败的点:
一、临时路径问题
问题:我的小程序给我直接生成的是相对路径
如:"http://tmp/cgPUMiaNgNtq6c9744dee3c6f6aa64d398a68246be57.png"
后来发现这样我直接把这种路径(临时路径)直接传给后端数据库
当我传完后直接渲染在页面的如下图所示
但是当我上传完在小程序重新刷新或者编译就会无法显然出来,如下图所示就直接显示图片区域但是真正的图片无法渲染出来
总结:tmp
目录:tmp
通常表示“临时”(temporary)目录。这意味着这些图片可能被存储在服务器的临时文件夹中。后端可能默认将文件存储到临时目录中,而不是正式的存储路径。如果后端系统没有正确处理文件的最终存储位置,文件可能会在服务器重启或清理临时文件时丢失。微信小程序的临时路径还有很多同样都无法正常的在数据库存储,常见的临时路径前缀(WeChat 小程序)如下:
- wxfile://tmp_...(最常见,Android/iOS 返回)
- wxfile://tmp/...(同上,目录形式)
- http://tmp/...( iOS 或开发者工具部分场景)
- /tmp/...(有些 API/转换后出现)
- tmp/...(相对 tmp 路径,常见于后处理或拼接)
二、本地存储
我又把路径改成了本地存储也不行,而且只能短时间的存储在前端,无法存到后端数据库如:"http://store/cgPUMiaNgNtq6c9744dee3c6f6aa64d398a68246be57.png",同样出现和临时路径一样的问题
在这我就很疑惑其他人的图片无法显示是正常的,为什么我自己本机上传的地址还是无法显示出来呢
三、拿到服务器的存储路径
经过了前面两点知道了不能使用临时路径,也不能使用本地存储后经过分析我必须拿到后端服务器真正的存储地址,这不得不跟后端人员商量写一个接口返回一个真实的存储路径,之后我在拿这个路径存到数据库
- afterRead: 组件事件回调(来自 Vant Uploader 或自定义组件)。
- wx.compressImage: 微信小程序媒体处理 API,用于图片压缩。
- wx.uploadFile: 微信小程序网络 API,用于文件上传(multipart/form-data)。
- JSON.parse: JavaScript 标准方法,将 JSON 字符串转对象。
// 模拟:上传接口地址(后端接收文件的URL)
const upLoadPhoto = 'xxxxxxxxxxx';
// 模拟:从本地取到的授权Token(实际请从 wx.getStorageSync('Token') 取)
const token = 'xxxxxxxxx';
// 模拟:van-uploader 产出的本地临时图片路径(真实形如 wxfile://tmp_xxx.jpg)
const mockLocalTempUrl = 'wxfile://tmp_1a2b3c4d5e6f.jpg';
// 模拟:后端上传成功后返回的相对路径(真实后端返回 data.fileName)
const mockServerReturnedPath = 'profile/upload/2025/08/21/abc123.jpg';
afterRead(/* e */) { // 组件回调:选择图片后触发
const that = this; // 保存实例引用
const file = { // 待上传文件对象(业务自定义结构)
name: '哈哈哈', // 业务自定义名称
url: mockLocalTempUrl, // 本地临时路径(wxfile://tmp_xxx)
serverUrl: '' // 服务器返回的文件相对路径(待填)
};
wx.compressImage({ // 压缩本地图片(微信API)
src: file.url, // 压缩源:本地临时路径
quality: 10, // 压缩质量 1-100(数值越小压缩越狠)
success: (res) => { // 压缩成功回调
wx.uploadFile({ // 上传文件(微信API,multipart/form-data)
url: upLoadPhoto, // 上传接口URL
filePath: res.tempFilePath, // 压缩后的本地文件路径
name: 'file', // 后端表单字段名
formData: { user: 'test' }, // 额外表单字段(示例)
header: { // 请求头
'Authorization': token // 鉴权:Bearer <token>
},
success: (uploadRes) => { // 上传成功回调
const data = JSON.parse(uploadRes.data); // 解析后端JSON
if (uploadRes.statusCode === 200) { // HTTP状态码校验
file.serverUrl = data.fileName || mockServerReturnedPath; // 后端返回的相对路径
that.setData({ // 更新页面数据(不可变方式追加)
fileList: [ ...(that.data.fileList || []), file ], // 文件展示用列表
photoAry: [ ...(that.data.photoAry || []), file.serverUrl ] // 提交给后端的路径数组
});
}
}
});
}
});
}
当我以为到这步就要结束的时候,出现的结果还是同我临时路径一样重新编译还是无法出来,但是问题结果已经处理到90%了,不要放弃!
最终结果:需要在在路径的前面加上自己的ip地址(http://localhost:8080/profile/upload/2025/08/13/24HEA54Dfl3X6c9744dee3c6f6aa64d398a68246be57_20250813141926A062.jpg),如果不是自己启动的后台,换后端的项目启动时同样ip也记得换
1、可以在js处理加上ip后重新赋一个值作为图片的渲染路径
2.也可以在渲染的时候在字段前面加ip
我这里的imageBaseURL就是我自己ip
!!!!!!!!!!!!!!!!!!!注意!!!!!!!!!!!!!!!!!11
如果从数据库获取的图片路径不是在同一个服务器下没有渲染出来是正常的,如下的渲染报错的图片路径不是我本机自己上传的,也没有连同一个服务器后台,所以照片不在我本机上也不在我连的服务器上所以渲染不出来是正常的。
好了,希望以上这篇文章能够帮助大家!!!!
更多推荐
所有评论(0)