vue+el-upload(封装华为云OBS上传文件)前端直传

今天有个需求,把项目中上传文件从后台服务端搬到华为云OBS上,找了好多资料发现好多博主并没写用什么调用,而是把华为云文档搬过来,特封装了一个完成组件复用,下面话不多说直接上代码

注释:代码中###是需要填写自己东西的

<template>
  <div class="upload-file">
<el-upload
  multiple
  action
  :on-change="fileChange"
  :before-upload="handleBeforeUpload"
  :file-list="fileList"
  :limit="limit"
  :on-exceed="handleExceed"
  :show-file-list="false"
  :headers="headers"
  class="upload-file-uploader"
  ref="upload"
>
  <!-- 上传按钮 -->
  <el-button size="mini" type="primary">选取文件</el-button>
  <!-- 上传提示 -->
  <div class="el-upload__tip" slot="tip" v-if="showTip">
        请上传
    <template v-if="fileSize">
      大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
    </template>
    <template v-if="fileType">
      格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
    </template>
    的文件
  </div>
</el-upload>

<!-- 文件列表 -->
<transition-group
  class="upload-file-list el-upload-list el-upload-list--text"
  name="el-fade-in-linear"
  tag="ul"
>
  <li
    :key="file.url"
    class="el-upload-list__item ele-upload-list__item-content"
    v-for="(file, index) in fileList"
  >
    <el-link :href="file.url" :underline="false" target="_blank">
      <span class="el-icon-document"> {{ file.name }} </span>
    </el-link>
    <div class="ele-upload-list__item-content-action">
      <el-link :underline="false" @click="handleDelete(index)" type="danger"
        >删除</el-link
      >
    </div>
  </li>
</transition-group>
  </div>
</template>

<script>
import { uuid } from "vue-uuid";
import { getToken } from "@/utils/auth";
import ObsClient from "esdk-obs-browserjs/src/obs";
export default {
  name: "FileUpload",
  props: {
// 值
value: [String, Object, Array],
// 数量限制
limit: {
  type: Number,
  default: 5,
},
// 大小限制(MB)
fileSize: {
  type: Number,
  default: 5,
},
// 文件类型, 例如['png', 'jpg', 'jpeg']
fileType: {
  type: Array,
  default: () => ["doc", "xls", "ppt", "txt", "pdf"],
    },
// 是否显示提示
isShowTip: {
  type: Boolean,
  default: true,
},
  },
  data() {
return {
  number: 0,
  uploadList: [],

  headers: {
    Authorization: "Bearer " + getToken(),
  },
  fileList: [],
  file: undefined,
};
  },
  watch: {
value: {
  handler(val) {
    if (val) {
      let temp = 1;
      // 首先将值转为数组
      const list = Array.isArray(val) ? val : this.value.split(",");
      // 然后将数组转为对象数组
      this.fileList = list.map((item) => {
        if (typeof item === "string") {
          item = { name: item, url: item };
        }
        item.uid = item.uid || new Date().getTime() + temp++;
        return item;
      });
    } else {
      this.fileList = [];
      return [];
    }
  },
  deep: true,
  immediate: true,
},
  },
  computed: {
// 是否显示提示
showTip() {
  return this.isShowTip && (this.fileType || this.fileSize);
},
  },
  methods: {
uploadObs() {},
fileChange(file, fileList) {
  this.file = file;
},
// 上传前校检格式和大小
handleBeforeUpload(file) {
  console.log(file);
  let that = this;
  // 校检文件类型
  if (this.fileType) {
    let fileExtension = "";
    if (file.name.lastIndexOf(".") > -1) {
      fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1);
    }
    const isTypeOk = this.fileType.some((type) => {
      if (file.type.indexOf(type) > -1) return true;
      if (fileExtension && fileExtension.indexOf(type) > -1) return true;
      return false;
    });
    if (!isTypeOk) {
      this.$modal.msgError(
        `文件格式不正确, 请上传${this.fileType.join("/")}格式文件!`
      );
      return false;
    }
  }
  // 校检文件大小
  if (this.fileSize) {
    const isLt = file.size / 1024 / 1024 < this.fileSize;
    if (!isLt) {
      this.$modal.msgError(`上传文件大小不能超过 ${this.fileSize} MB!`);
      return false;
    }
  }
  this.$modal.loading("正在上传文件,请稍候...");
  let uuids = uuid.v1() + Date.now();
  // 创建ObsClient实例
  var obsClient = new ObsClient({
    access_key_id: "###########", // 你的ak
    secret_access_key: "#########", // 你的sk
    server: "https://####", // 你的endPoint  记得加入https://
  });
  obsClient.putObject(
    {
      Bucket: "####", // 桶名
      Key: uuids, // 文件名    此处用的是uuid+ 时间戳

      SourceFile: file, //流文件
    },
    function (err, result) {
      if (err) {
        console.error("Error-->" + err);
        that.handleUploadError();
      } else {
        console.log("Status-->" + result.CommonMsg.Status);
        console.log(12312312);
        that.uploadList.push({
          name: `${uuids}`, //名字自取 这里我用了uuid + 时间戳
          url: `https://ye-shuo-ddb.obs.cn-east-3.myhuaweicloud.com/${uuids}`,  // 因为访问路径OBS没有给你返回需要自行拼接   拼接格式: https:// +  桶名 + endPoint  +  /  + 上传的文件路径
        });

        that.fileList = that.fileList.concat(that.uploadList);
        that.uploadList = [];
        that.number = 0;
        that.$emit("input", that.listToString(that.fileList));
        that.$modal.closeLoading();
        console.log(that.fileList);
      }
    }
  );

  this.number++;

  return true;
},
// 文件个数超出
handleExceed() {
  this.$modal.msgError(`上传文件数量不能超过 ${this.limit} 个!`);
},
// 上传失败
handleUploadError(err) {
  console.log(err);
  this.$modal.msgError("上传图片失败,请重试");
  this.$modal.closeLoading();
},

// 删除文件
handleDelete(index) {
  this.fileList.splice(index, 1);
  this.$emit("input", this.listToString(this.fileList));
},
// 获取文件名称
getFileName(name) {
  return name;
},
// 对象转成指定字符串分隔
listToString(list, separator) {
  let strs = "";
  separator = separator || ",";
  for (let i in list) {
    strs += list[i].url + separator;
  }
  return strs != "" ? strs.substr(0, strs.length - 1) : "";
    },
  },
};
</script>

<style scoped lang="scss">
.upload-file-uploader {
  margin-bottom: 5px;
}
.upload-file-list .el-upload-list__item {
  border: 1px solid #e4e7ed;
  line-height: 2;
  margin-bottom: 10px;
  position: relative;
}
.upload-file-list .ele-upload-list__item-content {
  display: flex;
  justify-content: space-between;
  align-items: center;
  color: inherit;
}
.ele-upload-list__item-content-action .el-link {
  margin-right: 10px;
}
</style>

以上代码为封装的组件代码,需要引入父组件后调用配置

下面图为组件调用,注册跟引入就不用我多说了吧,不会的自行百度

在这里插入图片描述

其中需要npm 安装 vue-uuid 命令如下

 npm install --save vue-uuid

另需要安装OBSnpm包

npm i esdk-obs-browserjs

注:华为云前端直接上传的话会出现跨域报错,把华为云OBS CORS跨域规则设置一下

在这里插入图片描述
我设置的规则全部打开了

在这里插入图片描述

访问路径!!! 代码中注释也有写

browserjs的sdk在上传的回调中没有返回文件访问地址, 所以我们可以自己进行拼接

‘https://’ + bucket + ‘.obs.cn-north-4.myhuaweicloud.com/’ + key
bucket是桶名, bucket后面的字符串是 endPoint, 一般endPoint是

https://obs.cn-north-4.myhuaweicloud.com
去掉https即可. 最后的key则是文件名, 或文件路径+文件名

至此就可以上传+访问了,感谢小伙伴们的观看,如果帮到了你,请给我点个赞吧 谢谢~笔芯

在这里插入图片描述
在这里插入图片描述
CSDN私信我,接私活

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现vue3分段上传视频到华为云obs,你可以按照以下步骤操作: 1. 在vue3项目中引入obs-sdk-js库,用于连接华为云obs服务。 2. 创建一个上传对象,设置上传参数,如上传的文件名、文件大小等。 3. 将上传文件分段,每个分段大小为1MB-5MB,使用obs-sdk-js库的putObject接口上传每个分段。 4. 当所有分段上传完成后,使用obs-sdk-js库的completeMultipartUpload接口合并所有分段。 以下是一个简单的代码示例: ``` import OBS from 'obs-sdk-js' const obs = new OBS({ access_key_id: 'your_access_key_id', secret_access_key: 'your_secret_access_key', server: 'obs.cn-north-1.myhuaweicloud.com' }) async function uploadVideo(file) { const objectName = file.name const fileSize = file.size const partSize = 5 * 1024 * 1024 // 5MB const parts = Math.ceil(fileSize / partSize) // Step 1: Initiate multipart upload const { uploadId } = await obs.initiateMultipartUpload({ Bucket: 'your_bucket_name', Key: objectName }) // Step 2: Upload all parts const partPromises = [] for (let i = 0; i < parts; i++) { const start = i * partSize const end = Math.min(start + partSize, fileSize) const partNumber = i + 1 const partData = file.slice(start, end) const partPromise = obs.uploadPart({ Bucket: 'your_bucket_name', Key: objectName, PartNumber: partNumber, UploadId: uploadId, Body: partData }) partPromises.push(partPromise) } await Promise.all(partPromises) // Step 3: Complete multipart upload await obs.completeMultipartUpload({ Bucket: 'your_bucket_name', Key: objectName, UploadId: uploadId }) console.log('Video uploaded successfully!') } ``` 在上面的代码中,我们首先初始化了一个OBS对象,然后在uploadVideo函数中,我们使用initiateMultipartUpload接口创建一个分段上传的任务,并获取到任务的uploadId。然后,我们将上传文件分成多个大小相同的分段,使用uploadPart接口上传每个分段。最后,当所有分段上传完成后,我们使用completeMultipartUpload接口合并所有分段。 注意,上面的代码示例仅供参考,具体实现可能需要根据你的项目需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值