Angular 5运行时无法显示用户上传图片问题求助
咱们来拆解下你遇到的核心问题,以及给出对应的解决方案:
为什么开发时会出现404和路由错误?
Angular的ng serve开发服务器是把项目文件加载到内存中运行的,它只会在启动时读取assets文件夹的内容。当你在运行过程中上传图片到assets,开发服务器并不会自动识别新增的文件,所以请求这个图片时就会返回404。
而你在新标签页打开路径时出现路由匹配错误,是因为开发服务器找不到这个静态文件,就会把它当成路由路径交给Angular的路由系统处理,自然就匹配不到对应的路由了。
等你执行ng build编译项目后,所有文件(包括你上传到assets的图片)都会被打包到dist目录,此时静态文件服务器能正确找到这些文件,所以功能就正常了。
assets文件夹适合存用户上传的内容吗?
答案是完全不适合,原因有这几点:
- 如你遇到的问题,开发模式下新增文件不会被开发服务器识别,严重影响开发体验;
- 生产环境中,
assets里的内容会被打包到部署包中,用户上传的动态内容不属于代码包的一部分,每次用户上传新文件都要重新打包部署显然不合理; - 权限和维护问题:assets是项目代码目录,通常由版本控制管理,用户上传的内容不应该混入代码仓库。
正确的解决方案
1. 开发环境临时调试方案
如果你只是想在开发时临时看到效果,可以在上传图片后重启ng serve,这样开发服务器会重新读取assets目录的内容,图片就能正常加载了。但这只是临时方案,绝对不要用到生产环境。
2. 配置开发服务器的静态资源目录
在Angular5的.angular-cli.json中,找到apps[0].assets数组,添加一个专门存放用户上传文件的目录(比如src/uploads),配置如下:
{ "glob": "**/*", "input": "./uploads", "output": "./uploads/" }
这样ng serve启动时会把uploads目录作为静态资源目录,后续上传文件到这个目录后,重启开发服务器就能识别了。
3. 生产环境的正确做法(推荐)
把用户上传的图片存储到后端服务器的专门静态目录(比如Node.js的public/uploads、Java的webapp/uploads等):
- 后端配置静态资源映射,让前端可以通过类似
/uploads/example.jpg的路径访问图片; - 把这个相对路径或者完整的后端URL保存到数据库;
- 前端
img标签的src直接使用这个路径即可。
你的HTML代码优化建议
当前代码逻辑没问题,但可以添加图片加载失败的降级处理,提升用户体验:
<!-- 显示用户上传的图片 --> <img *ngIf="carModel.imageUrl && carModel.imageId && !imageLoadFailed" [src]="carModel.imageUrl" height="250" width="400" alt="car model" (error)="imageLoadFailed = true" > <!-- 图片加载失败时显示默认图 --> <img *ngIf="!carModel.imageUrl || !carModel.imageId || imageLoadFailed" src="assets/images/default-car.jpg" height="250" width="400" alt="default car model" >
然后在组件类中添加一个状态变量:
imageLoadFailed = false;
内容的提问来源于stack exchange,提问作者IBRA

