如何基于vue3 + wangeditor富文本 实现上传图片和视频到阿里云 oss并插入到富文本进行回显

功能需求,在富文本中插入图片或视频到阿里云oss中,并在富文本中回显

1. 富文本组件 基础配置

<Editor
      :mode="mode"
      :defaultConfig="state.editorConfig"
      :style="{ height }"
      ref=""
      v-model="state.editorVal"
      @onCreated="handleCreated"
      @onChange="handleChange"
    />

//富文本配置
const state = reactive({
  editorVal: props.getHtml,
  editorConfig: {
    placeholder: props.placeholder,
    MENU_CONF: {},
    editorVal: props.getHtml,
  },
})

2. 配置alioss

  • 安装依赖 npm i ali-oss
  • utils文件夹下=>创建alioss.ts 代码如下
import OSS from 'ali-oss'
export function client<T>(accessKeyId: T, accessKeySecret: T) {
  console.log('接收到的', accessKeyId, accessKeySecret)
  var clients = new OSS({
    region: 'oss-cn-beijing', //阿里云oss地区
    accessKeyId, //id
    secure: true,
    accessKeySecret, //密钥
    bucket: 'vue3-sass', //远程仓库名称
  }) //后端提供数据
  console.log('打印返回的client', clients)
  return clients
}

3. 封装全局唯一标识符方法

  • utils文件夹下=>创建guid.ts 代码如下
// 生成GUID
export function newGuid() {
  function S4() {
    return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1)
  }
  return S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4()
}

4. 上传图片(直传) (包含上传图片 上传进度 获取文件后缀名方法)

//获取文件后缀名
const getExtension = (file: File) => {
  if (file) {
    // 通过正则表达式提取文件后缀名
    const regex = /(?:\.([^.]+))?$/
    const result = regex.exec(file.name)
    return result?.[1] || null
  }
  return null // 处理输入为 null 的情况
}
//上传图片 普通上传
state.editorConfig.MENU_CONF['uploadImage'] = {
  allowedFileTypes: ['image/*'], //限定上传类型
  // 单个文件的最大体积限制,默认为 2M
  maxFileSize: 2 * 1024 * 1024,
  // 超时时间,默认为 10 秒
  timeout: 10 * 1000, // 10 秒
  // 最多可上传几个文件,默认为 100
  maxNumberOfFiles: 100,
  headers: { Accept: 'text/x-json' },
  // 自定义图片上传
  async customUpload(files: File, insertFn: any) {
    percentage.value = 0
    showPercentage.value = true
    let AccessKeyId = '你的阿里云oss id'
    let AccessKeySecret = '你的阿里云oss 密钥'
    ElMessage({
      message: '开始上传,请等待!',
      type: 'warning',
    })
    const fileGuid = newGuid()
    const fileSuffix = getExtension(files)
    const newFileName = fileGuid + '.' + fileSuffix
    //初始化配置
    let res = await client(AccessKeyId, AccessKeySecret).put(
      newFileName,
      files,
      {
        progress,
        timeout: 120000, //设置超时时间
        headers: {
          'Content-Type': 'image/jpeg',
        },
      }
    )

    console.log('插入图片', res)
    //插入图片 地址
    insertFn(res.res.requestUrls[0])
    ElMessage({
      message: '上传成功!',
      type: 'success',
    })
    setTimeout(() => {
      showPercentage.value = false
    }, 500)
  },
}
//上传进度
const progress = (progress: any, checkpoint: any) => {
  // Object的上传进度。
  console.log('上传进度', progress)
  percentage.value = Number((progress * 100).toFixed(0))
  // 分片上传的断点信息。
  console.log('分片上传的断点信息', checkpoint)
  if (checkpoint && checkpoint.uploadId) {
    checkpoints[checkpoint.uploadId] = checkpoint
    console.log('打印checkpoints', checkpoints)
  }
}

5. 上传视频(分片上传)

//上传视频 分片上传
state.editorConfig.MENU_CONF['uploadVideo'] = {
  allowedFileTypes: ['video/*'],
  maxNumberOfFiles: 1,
  // 超时时间,默认为 10 秒
  timeout: 200 * 1000, // 5 秒
  // 最多可上传几个文件,默认为 100
  maxNumberOfFiles: 100,
  async customUpload(file: File, insertFn: any) {
    ElMessage({
      message: '开始上传,请等待!',
      type: 'warning',
    })
    percentage.value = 0
    showPercentage.value = true
    console.log('打印insertFn', insertFn)
   	 let AccessKeyId = '你的阿里云oss id'
    let AccessKeySecret = '你的阿里云oss 密钥'
    const fileGuid = newGuid()
    const fileSuffix = getExtension(file)
    const newFileName = fileGuid + '.' + fileSuffix
    let res = await client(AccessKeyId, AccessKeySecret).multipartUpload(
      newFileName,
      file,
      {
        parallel: parallel,
        partSize,
        timeout: 120000, //设置超时时间
        progress,
        headers: {
          'Content-Type': 'video/mp4',
        },
      }
    )
    const parts = res.res.requestUrls[0].split('?')
    if (parts.length > 1) {
      const cleanedString = parts[0]
      insertFn(cleanedString)
    } else {
      insertFn(res.res.requestUrls[0])
    }
    ElMessage({
      message: '上传成功!',
      type: 'success',
    })
    setTimeout(() => {
      showPercentage.value = false
    }, 500)
  },
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue3是一种流行的JavaScript框架,用于构建用户界面。它具有响应式数据绑定、组件化开发和虚拟DOM等特性,使得开发者可以更高效地构建交互式的Web应用程序。 要在Vue3中实现上传图片阿里云OSS,你可以按照以下步骤进行操作: 1. 安装依赖:首先,你需要安装阿里云OSS的JavaScript SDK。可以使用npm或yarn命令来安装,例如: ``` npm install ali-oss ``` 2. 配置OSS客户端:在Vue3的代码中,你需要创建一个OSS客户端实例,并配置相关参数,如AccessKeyId、AccessKeySecret、Endpoint等。这些参数可以在阿里云OSS控制台中获取。 3. 创建上传组件:在Vue3中,你可以创建一个上传组件,用于选择图片文件并触发上传操作。可以使用`<input type="file">`元素来实现文件选择功能,并监听其`change`事件。 4. 上传图片:在上传组件中,你可以编写上传图片的逻辑。当用户选择了图片文件后,你可以通过OSS客户端调用`put`方法来上传图片文件到阿里云OSS。 下面是一个简单的示例代码,演示了如何在Vue3中上传图片阿里云OSS: ```javascript <template> <div> <input type="file" @change="handleFileChange"> </div> </template> <script> import OSS from 'ali-oss'; export default { methods: { handleFileChange(event) { const file = event.target.files[0]; const client = new OSS({ accessKeyId: 'your-access-key-id', accessKeySecret: 'your-access-key-secret', bucket: 'your-bucket-name', region: 'your-oss-region', // 其他配置参数... }); // 生成唯一的文件名 const fileName = Date.now() + '-' + file.name; // 调用OSS客户端的put方法上传文件 client.put(fileName, file).then(response => { console.log('上传成功', response); // 在这里可以处理上传成功后的逻辑 }).catch(error => { console.error('上传失败', error); // 在这里可以处理上传失败后的逻辑 }); } } } </script> ``` 请注意,上述代码中的`your-access-key-id`、`your-access-key-secret`、`your-bucket-name`和`your-oss-region`需要替换为你自己的阿里云OSS相关信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gik99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值