一、图片存储方案介绍
1.存到自己公司购买的服务器上
- 优点:
好控制
- 缺点
成本高由于图片都存放到自己的服务器上,占据空间很大
2. 存到三方云服务器(阿里云,七牛云,腾讯云)
各种云有专门的为图片存储提供的云服务器,我们自己的服务器只存储图片地址即可
1.前端传
前端调用腾讯云API上传图片
2.后端传
图片文件传给自己的后端, 由后端上传到第三方图片服务器
二、腾讯云cos申请配置
官网:腾讯云 - 产业智变 云启未来
1.创建账号并实名认证
1.1打开腾讯云,点击右上角登录,使用微信扫码进行登录
1.2注册或关联账号
1.3提示关注腾讯云并完成账号注册
1.4注册完成
1.5点击去实名认证,选择个人认证,进行实名认证
2.开通对象存储
3.创建存储桶
一直下一步直到完成
4.设置cors规则
4.1在存储桶列表中,选中存储桶
4.2在左侧的菜单中选安全管理
我是在测试上传,全部容许上传即可,真正的生产环境需要单独配置具体的域名和操作方法
5.配置云API秘钥
服务器属于个人的,需要一定的权限才能自由上传图片,这个负责权限验证的其实就是秘钥,也就是说拥有秘钥是进行上传的必要条件。
安全性提示
实际工作中,秘钥属于敏感信息,不能直接放到前端存储,容易产生安全问题,更好的做法是把秘钥交给后端管理,前端通过调用接口先获取秘钥,有了秘钥之后再进行上传操作
三、上传图片组件
使用的是基于 element 框架提供的 Upload 上传组件封装自己的上传组件 ,其他同理
<el-uploadclass="avatar-uploader"action="https://jsonplaceholder.typicode.com/posts/":show-file-list="false":on-success="handleAvatarSuccess":before-upload="beforeAvatarUpload"><img v-if="imageUrl" :src="imageUrl" class="avatar"><i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload><style>.avatar-uploader .el-upload {border: 1px dashed #d9d9d9;border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;}.avatar-uploader .el-upload:hover {border-color: #409EFF;}.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 178px;height: 178px;line-height: 178px;text-align: center;}.avatar {width: 178px;height: 178px;display: block;}
</style><script>export default {data() {return {imageUrl: ''};},methods: {handleAvatarSuccess(res, file) {this.imageUrl = URL.createObjectURL(file.raw);},beforeAvatarUpload(file) {const isJPG = file.type === 'image/jpeg';const isLt2M = file.size / 1024 / 1024 < 2;if (!isJPG) {this.$message.error('上传头像图片只能是 JPG 格式!');}if (!isLt2M) {this.$message.error('上传头像图片大小不能超过 2MB!');}return isJPG && isLt2M;}}}
</script>
因为要自己设置上传行为,所以需要自定义上传属性,elementui文档Element - The world's most popular Vue UI framework
配置自定义上传属性
-
关键属性:
:http-request="upload" action="#"
-
使用自定义行为覆盖默认上传,注意一旦设置自定义上传行为之后,所有的上传操作都需要自己实现,比如数据处理,上传成功之后的后续操作,on-success 钩子函数也不会继续触发
-
修改组件代码
-
<el-uploadclass="avatar-uploader"action="#":show-file-list="false":http-request="httpRequestFn"><img v-if="imageUrl" :src="imageUrl" class="avatar"><i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload><style>.avatar-uploader .el-upload {border: 1px dashed #d9d9d9;border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;}.avatar-uploader .el-upload:hover {border-color: #409EFF;}.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 178px;height: 178px;line-height: 178px;text-align: center;}.avatar {width: 178px;height: 178px;display: block;} </style><script>export default {data() {return {imageUrl: ''};},methods: {// 自定义上传函数// http-request属性的回调函数有一个默认的参数,content 是一个对象,这个形参不用传实参httpRequestFn(res) {console.log(res)cos.putObject({Bucket: 'guotongxin-1309007594', /* 必须:存储桶 */Region: 'ap-nanjing', /* 存储桶所在地域,必须字段 */Key: res.file.name, /* 必须 :文件名 */StorageClass: 'STANDARD', // 上传模式Body: res.file, // 上传文件对象onProgress: function(progressData) { // 进度条console.log(JSON.stringify(progressData))}}, (err, data) => { // 注意用箭头函数,否则会出现this的指向问题console.log(err || data)if (data) { // 上传成功this.imageUrl = `http://${data.Location}`console.log(this.$refs.uploadImg)}})}}} </script>
四、上传图片到腾讯云
1.安装依赖
npm i cos-js-sdk-v5 --save
2.实例化 cos 对象
// 导入 cos 模块
const COS = require('cos-js-sdk-v5')// SECRETID 和 SECRETKEY请登录 https://console.cloud.tencent.com/cam/capi 进行查看和管理
var cos = new COS({SecretId: 'xxx',SecretKey: 'xxx'
})
3.使用 cos 对象完成上传
httpRequestFn(res) {console.log(res)cos.putObject({Bucket: 'guotongxin-1309007594', /* 必须:存储桶 */Region: 'ap-nanjing', /* 存储桶所在地域,必须字段 */Key: res.file.name, /* 必须 :文件名 */StorageClass: 'STANDARD', // 上传模式Body: res.file, // 上传文件对象onProgress: function(progressData) { // 进度条console.log(JSON.stringify(progressData))}}, (err, data) => { // 注意用箭头函数,否则会出现this的指向问题console.log(err || data)if (data) { // 上传成功this.imageUrl = `http://${data.Location}`console.log(this.$refs.uploadImg)}})}
4.如何查看 Bucket 和 Region
5.根据你的项目情况将imageUrl传给后台同步信息即可
SDK文档:对象存储 操作列表 - API 文档 - 文档中心 - 腾讯云
JavaScript SDK文档:对象存储 快速入门 - SDK 文档 - 文档中心 - 腾讯云