目标:
主流の画像ストレージ ソリューションとアップロード プロセスを理解する
プラン説明
プラン |
シーン |
主流か |
自社の通常サーバーに格納 |
写真の少ないシンプルなシーン |
いいえ |
サードパーティのクラウド サーバーに保存 |
大量の写真や動画など、追加機能が必要、透かし加工、動画レビューなど(プロの人がプロの仕事をする) Qiniu Cloud/Tencent Cloud/Alibaba Cloud |
はい |
写真の実際のリソースはサードパーティのクラウド サーバーに保存され、独自のデータベースには有効な写真の URL アドレスが保存されます。
フローの説明
写真をクラウド サーバーにアップロードする場合、アップロード プロセスはどのようなものですか? バックエンドで画像をアップロードする方法は、画像を送信する際の秘密鍵制御などのセキュリティ戦略を設計することで、バックエンドの統合制御を制御しやすくなるため、より汎用性があります。
Tencent クラウド cos アプリケーション構成
目標: 既製の Tencent クラウド サービスを使用して無料のクラウド ストレージを作成する
1. 実名認証用のアカウントを作成する
ここでは、実名情報を入力する必要があります。安心して書いてください。漏れることはありません。
2.バケットを作成する
3.コアルールを設定する
ここでは、アップロードのテストを行っているため、すべてのアップロードが許可されていますが、実際の運用環境では、特定のドメイン名と操作方法を個別に構成する必要があります。
4. キー設定手順
サーバーは個人的なものであり、写真を自由にアップロードするには特定の権限が必要です. 権限の検証を担当する人は、実際には秘密鍵であるため、秘密鍵を持っていることがアップロードの必要条件です.
キー構成
セキュリティのヒント
実際の作業では、秘密鍵は機密情報であり、フロントエンドに直接格納できないため、セキュリティ上の問題が発生しやすい. より良いアプローチは、秘密鍵をバックエンドの管理者に渡すことです. フロントエンドは取得します.最初にインターフェイスを呼び出して秘密鍵を取得します。秘密鍵を取得したら、次にアップロードします。
以上で準備完了です~
5. コンポーネントのアップロード - 基本パッケージ
目標: ビジネス コンポーネントで使用する共通のアップロード コンポーネントをカプセル化する
要件を理解し、新しいアップロード コンポーネントを作成する
ニーズを理解する
目標: 従業員のプロフィール写真やその他の名前、携帯電話番号は、並置された複数のフィールドです. これらのフィールドは、将来的にインターフェイスを介してバックエンドに送信する必要があります
アップロード コンポーネントから画像を選択し、その画像をクラウド サーバーにアップロードします クラウド サービスから有効な画像の URL が返されます
新しいパブリック アップロード コンポーネントを作成する
当社のアップロード機能は、要素アップロード コンポーネントの二次開発に基づいており、まず必要な elementUI アップロード コンポーネントを準備し、特定のビジネス ニーズに応じて適切なサンプル コードを選択します。
カスタム アップロード構成
キー属性: :http-request="upload" action="#"
カスタム動作を使用して、デフォルトのアップロードをオーバーライドします。カスタム アップロード動作を設定したら、データ処理など、すべてのアップロード操作を自分で実装する必要があることに注意してください。正常にアップロードした後、後続の操作では、成功時のフック関数は引き続きトリガーされません
<template>
<div>
<el-upload
class="avatar-uploader"
action="#"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
:http-request="upload"
>
<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 {
data() {
return {
imageUrl: ''
}
},
methods: {
// 回调函数 自定义上传逻辑 适合不能直接上传给自己的服务器 需要一些自定义写法上传三方 加上这个之后 组件只负责图片校验 上传部分不管了
upload(file) {
console.log(file)
},
// 上传完毕自动执行 添加:http-request后 当前函数失效
handleAvatarSuccess(res, file) {
this.imageUrl = URL.createObjectURL(file.raw)
},
// 上传前自动效验 校验通过执行
beforeAvatarUpload(file) {
const isPNG = file.type === 'image/png'
const isLt2M = file.size / 1024 / 1024 < 2
if (!isPNG) {
this.$message.error('上传头像图片只能是 PNG 格式!')
}
if (!isLt2M) {
this.$message.error('上传头像图片大小不能超过 2MB!')
}
return isPNG && isLt2M
}
}
}
</script>
<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>
アップロードとエコーを実装する
cos Tencent クラウド ドキュメント アドレスhttps://cloud.tencent.com/document/product/436/35649#.E7.AE.80.E5.8D.95.E4.B8のアップロード API に従ってアップロード機能を実現します。 8A.E4 .BC.A0.E5.AF.B9.E8.B1.A1
1- sdk ファイルのインストール
npm i cos-js-sdk-v5
2- Cos を導入し、cos オブジェクトをインスタンス化する
Note: This can only be used as a test to avoid the key id in the js code.
実際の開発中にフロントエンドがまだアップロードをリードしている場合、正しいプロセス は次のとおりです。独自のバックエンド インターフェイスを呼び出して一時的な秘密鍵を取得する [短時間で期限切れになる]
2 取得した一時的な秘密鍵を渡して cos オブジェクトをインスタンス化する
3 必要に応じてデータを送信する
// 引入必要的COS模块
const COS = require('cos-js-sdk-v5')
// 实例化对象
const cos = new COS({
SecretId: 'xxxx', // 身份识别ID
SecretKey: 'xxxx' // 身份秘钥
})
3- cos オブジェクトを使用してアップロード
オブジェクト ストレージ アップロード オブジェクトを完成させる-SDK ドキュメント-ドキュメント センター-Tencent Cloud
upload({file}) {
if (file) {
// 执行上传操作
cos.putObject({
Bucket: 'xxxxxx', /* 存储桶 */
Region: 'xxxx', /* 存储桶所在地域,必须字段 */
Key: file.name, /* 文件名 */
StorageClass: 'STANDARD', // 上传模式, 标准模式
Body: file, // 上传文件对象
onProgress: (progressData) => {
console.log(JSON.stringify(progressData))
}
}, (err, data) => {
console.log(err || data)
// 上传成功之后
if (data.statusCode === 200) {
this.imageUrl = `https:${data.Location}`
}
})
}
}
6. アップロード コンポーネント - 業務用
任务:
親子通信モードで画像アップロードエコーを実現
1-データベースへのURLの送信を実現する[子から親へ]
// 子组件
if (data.statusCode === 200) {
this.imageUrl = `https://${data.Location}`
// 执行这个自定义事件把url传出去
this.$emit('get-url', this.imageUrl)
}
// 父组件
<upload-img @get-url="getUrl" />
getUrl(url) {
console.log(url)
// 图片上传完毕之后 用于提交给后端的字段里就有了有效的url
this.userInfo.staffPhoto = url
}
2- 画像の URL を更新して埋め戻す [父から息子へ + 時計の同期]
// 父组件
<upload-img :url="userInfo.staffPhoto" @get-url="getUrl" />
// 子组件
props: {
url: {
type: String,
default: ''
}
},
watch: {
url: function() {
this.imageUrl = this.url
}
}