图片常见的储存方式
方案一:存到自己公司购买的服务器上
优点:好控制
缺点:成本高由于图片都存放到自己的服务器上,占据空间很大
方案二:存到三方云服务器(阿里云,七牛云,腾讯云)
各种云有专门的为图片存储提供的云服务器,我们自己的服务器只存储图片地址即可
提前准备工作(腾讯云使用操作)
1.创建账户并实名认证
2.开通对象存储
3.创建存储桶
4.设置cors规则
4.1 在存储桶列表中,选中存储桶
4.2 在左侧的菜单中选安全管理
真正的生产环境需要单独配置具体的域名和操作方法,以下方法是按照测试环境配置
5.配置云API秘钥
服务器属于个人的,需要一定的权限才能自由上传图片,这个负责权限验证的其实就是秘钥。拥有秘钥是进行上传的基础条件。
安全提示
实际工作中,秘钥属于敏感信息,不能直接放到前端存储,容易产生安全问题,更好做法将秘钥交给后端管理,前端通过调用接口先获取秘钥,有秘钥后再进行上传操作。
图片组件准备
1、基于element上传组件,可以封装一个通用的上传组件供业务组件使用,用来把图片上传到cos中,组件有两个功能:
- 展示图片(初始显示图片)
- 修改图片
前端主动发起图片上传使用的是三方的腾讯云上传接口,前端得到一个已经上传完毕的图片地址,然后把这个地址当成一个接口字段 传给我们自己的后端服务。
2、下载一个官方提供的操作cos服务的包(cos-js-sdk-v5)
3、用自己的密钥去实例化cos
<template>
<div>
<el-upload
class="avatar-uploader"
action="#" //用来指定文件要上传的地址,由于我们需要定制上传动作,这里设为#自动找本地地址
:show-file-list="false" //是否显示上传的文件列表
:http-request="handleClick" //自定义上传行为
:before-upload="beforeAvatarUpload" //上传之前的检查
/*
http-request 添加这个属性,就会覆盖默认的 action行为,做了一个自定义操作
:on-success 上传成功之后的回调,
*/
>
<img v-if="imageUrl" :src="imageUrl" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon" />
</el-upload>
</div>
</template>
<script>
export default {
name: 'UploadImg',
data() {
return {
imageUrl: ''
}
},
methods: {
beforeAvatarUpload(file) {
//只支持JPG格式
// 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
//图片支持所有格式
const isLt2M = file.size / 1024 / 1024 < 2
if (!isLt2M) {
this.$message.error('上传头像图片大小不能超过 2MB!')
}
return isLt2M
},
handleClick({ file }) {
console.log(file, 'handleClick', 7777)
/* 1-导入sdk包文件 ,使用第三方sdk来实现图片上传*/
var COS = require('cos-js-sdk-v5')
/* 2-填写秘钥 */
var cos = new COS({
SecretId: 'AKID63nJVSBfuvnS55555rQlrnW5LODoAH9mAJ',//设置自己的密钥地址
SecretKey: 'yiDTUIr1vYt0uZy7777772A1bvLRIvJRK0R'
})
/* 3-填写存储桶配置项 */
cos.putObject(
{
Bucket: '***-77-1310934973' /* 存储桶名称 */,
Region: 'ap-nanjing' /* 存储桶所在地域,必须字段 */,
Key: file.name /* 必须 /* 文件名 */,
StorageClass: 'STANDARD', // 上传模式, 标准模式
Body: file, // 上传文件对象
onProgress: function(progressData) {
console.log(JSON.stringify(progressData))
}
},
(err, data) => {
// console.log(err || data);
this.imageUrl = 'https://' + data.Location
}
)
}
}
}