vue上传头像

157 阅读2分钟

一、html

 <!--上传照片 -->
              <div class="list_item flexed align-item-start">
                <div class="item_label">上传照片:</div>
                <el-upload
                  class="avatar-uploade item_picture"
                  action=""
                  :show-file-list="false"
                  :http-request="(file) => httpRequestUpload(file, 'Avatar')"
                  @change="onChangeAvatar"
                >
                  <img
                    v-if="userResume.avatar"
                    :src="store.pictureUrl + userResume.avatar"
                    class="avatar"
                    @click.stop
                  />
                  <el-icon v-else class="avatar-uploader-icon"
                    ><Plus
                  /></el-icon>
                  <div class="handle_container">
                    <div class="flexed align-items-center">
                      <!-- 编辑, -->
                      <el-icon :size="16" color="rgba(195, 13, 35, 1)"
                        ><Edit
                      /></el-icon>
                      <div class="item_handle edit">编辑</div>
                    </div>
                  </div>
                </el-upload>
              </div>

二、css

.list_item {
          height: auto;
          .item_label {
            width: 80px;
            height: 22px;
            font-size: 16px;
            font-weight: 400;
            letter-spacing: 0px;
            line-height: 22px;
            color: rgba(102, 102, 102, 1);
          }
          .item_input {
            height: 50px;
            border-radius: 4px;
            background: rgba(247, 248, 250, 1);
            font-size: 16px;
            font-weight: 400;
          }
          .item_inputPlacer {
            color: rgba(153, 153, 153, 1);
          }
          .item_choise {
            height: 50px;
            opacity: 1;
            border-radius: 4px;
            background: rgba(247, 248, 250, 1);
            font-size: 16px;
            font-weight: 400;
            text-align: center;
            line-height: 50px;
          }
          .item_choise.default {
            color: rgba(153, 153, 153, 1);
          }
          .item_choise.active {
            color: rgba(195, 13, 35, 1);
            box-shadow: 0 0 2px rgba(195, 13, 35, 1) inset;
          }
          .item_picture {
            width: 130px;
            height: 130px;
            border-radius: 4px;
            background: rgba(247, 248, 250, 1);
            .avatar {
              width: 130px;
              height: 130px;
            }
            .handle_container {
              margin: 115px 0 0 10px;
              .item_handle {
                width: 30px;
                height: 16px;
                font-size: 14px;
                line-height: 16px;
                margin: 0 0 0 4px;
              }
              .edit {
                color: rgba(195, 13, 35, 1);
              }
              .delete {
                color: rgba(102, 102, 102, 1);
              }
              .handle_height {
                margin: 20px 0 0 0;
              }
            }
          }
        }

三、js

// 图片上传函数
const httpRequestUpload = (params, type) => {
  const file = params.file;
  switch (type) {
    case "Avatar":
      if (file.size / 1024 / 1024 > 10) {
        ElMessage.error("图片过大,请重新上传图片");
        return false;
      } else {
        let requireParameter = {
          fileNames: [file.name],
          fileType: "IMAGE",
        };
        uploadFile(requireParameter).then((res) => {
          upDateOss(res, file)
            .then((ossRes) => {
              if (res.code == 200) {
                store.saveUserAvatar(ossRes.keyValue);
                console.log("UserAvatar", store.userAvatar);
                return false;
              } else {
                ElMessage.error(res.message);
              }
            })
            .catch((error) => {
              ElMessage.error(error.message);
            });
        });
      }
    case "Video":
      if (file.size / 1024 / 1024 > 200) {
        ElMessage.error("视频最大可上传:200M");
        return false;
      } else {
        let requireParameter = {
          fileNames: [file.name],
          fileType: "IMAGE",
        };
        uploadFile(requireParameter).then((res) => {
          upDateOss(res, file)
            .then((ossRes) => {
              if (res.code == 200) {
                store.saveUserVideo(ossRes.keyValue);
                console.log("UserVideo", store.userVideo);
                return false;
              } else {
                ElMessage.error(res.message);
              }
            })
            .catch((error) => {
              ElMessage.error(error.message);
            });
        });
      }
  }
};
// 改变头像
const onChangeAvatar = () => {
  userResume.value.avatar = store.userAvatar;
  console.log(userResume.value.avatar);
};
// 关于简历的api
import {
    useIndexStore
} from "@/stores/index";
const store = useIndexStore();

import {
    fetchGetOrDeleteOrPut,
    fetchPost
} from '@/utils/request.js'
// 上传图片
export function upDateOss(res, file, type) {
    let keyValue = res.data.dirs[0];
    let formData = new FormData();
    formData.append('OSSAccessKeyId', res.data.accessId) // //accessKeyId
    formData.append('policy', res.data.policy) // policy
    formData.append('signature', res.data.signature) //签名
    formData.append('key', res.data.dirs[0]) // 文件名称
    formData.append('file', file.file ? file.file : file, file.file ? file.file.name : file.name) // 如果是base64文件,那么直接把base64字符串转成base64
    return new Promise((resolve, reject) => {
        fetchPost(res.data.host, formData, {
            headers: {
                'Content-Type': 'multipart/form-data'
            },
        }).then((rep) => {
            store.savePictureUrl();
            resolve({
                rep,
                keyValue
            })
        }).catch((err) => {
            reject(err)
        })
    })
}
export function uploadFile(parameter) {
    return fetchPost('common/material/v1/signature', parameter)
}