vue(2或3)前端直接上传到阿里云图片(不经过后端)

需求

1.实现web端或者 H5 端直接上传文件或者图片到阿里云

2.一般上传图片是去调用后端的接口 后端去实现阿里云的上传 

oss.js 上传文件(这里的文件 其实 最主要写对阿里云的密钥 和 upload上传方法)

const OSS = require('ali-oss')
const config = {
  ossConfig: {
    region: '',
    bucket: '',
    accessKeyId: '',
    accessKeySecret: ''
  }
}

export function readFileAsBuffer(file) {
  const reader = new FileReader()
  return new Promise((resolve, reject) => {
    reader.readAsDataURL(file)
    reader.onload = function (e) {
      const base64File = reader.result.replace(/^data:\w+\/\w+;base64,/, '')
      resolve(new OSS.Buffer(base64File, 'base64'))
    }
  })
}

// 生成唯一onlyId
export function onlyId() {
  const s = []
  const hexDigits = '0123456789abcdef'
  for (let i = 0; i < 36; i++) {
    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
  }
  s[14] = '4' // bits 12-15 of the time_hi_and_version field to 0010
  s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1) // bits 6-7 of the clock_seq_hi_and_reserved to 01
  s[8] = s[13] = s[18] = s[23] = '-'
  let onlyId = s.join('')
  return onlyId
}

export function upload(file_re, file, type) {
  const client = new OSS({
    region: config.ossConfig.region,
    bucket: config.ossConfig.bucket,
    accessKeyId: config.ossConfig.accessKeyId,
    accessKeySecret: config.ossConfig.accessKeySecret
  })

  if (type == 'images') {
    let size = file.size
    if (size / (1024 * 1024) > 1) {
      notification.error({
        message: '图片错误',
        description: '图片文件大小不能超过1M'
      })
      return
    }
  } else if (type == 'video') {
    let size = file.size
    if (size / (1024 * 1024) > 10) {
      notification.error({
        message: '视频错误',
        description: '视频文件大小不能超过10M'
      })
      return
    }
  }

  let imgType = file.name.substr(file.name.length - 4)
  let store = `/${type}/` + onlyId() + imgType

  return client.put(store, file_re).then(res => {
    return {
      data: res,
      url: res.url
    }
  })
}
const handleFileChange = (event, index) => {
  console.log(event, index);
  handleUpload(event.target.childNodes[0].files[0], index);
};
const readFile = (file) => {
  console.log(file, "-------------");
  return new Promise((resolve, reject) => {
    const OSS = require("ali-oss");
    let fileRead = new FileReader();
    fileRead.readAsDataURL(file);
    fileRead.onload = function (e) {
      const base64File = fileRead.result.replace(/^data:\w+\/\w+;base64,/, "");
      const ossBuffer = new OSS.Buffer(base64File, "base64");
      resolve({ ossBuffer, fileRead });
    };
  });
};
const handleUpload = async (file, index) => {
  const res = await readFile(file);
  const alRes = await upload(res.ossBuffer, file, "ticketImg");
  console.log(index, "index 下标");
  imageList[index].img = alRes.url;
  console.log(imageList, "imageList");
  console.log(alRes, "结果");
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分片上传指将大文件拆分成若干小块进行上传,可以有效地提高上传的效率和稳定性,降低上传失败的概率。在前端Vue框架中,可以使用插件或组件实现分片上传功能,例如Element-UI或Vue-Upload-Component。而在后端Java中,可以使用SpringBoot或SpringMVC进行文件上传处理,同时结合使用阿里云、七牛云等云存储服务提高上传速度和可靠性。 具体实现流程如下: 1. 前端分片上传:前端先通过文件选择器选择要上传的文件,然后使用分片算法将大文件拆分成小块进行上传,每个小块的大小可以自行设置。前端也需要处理上传过程中的中断、暂停、恢复等问题,以确保文件上传的完整性和稳定性。 2. 后端接收上传请求:后端使用SpringBoot或SpringMVC接收前端的上传请求,包括文件信息和文件分块信息。后端可以对请求做一些校验,例如文件是否存在,上传的文件大小是否超过限制等等。 3. 后端分块合并:后端通过计算分块的MD5值,将分块合并成完整的文件。合并后的文件可以临时存储在本地磁盘,也可以直接传到阿里云、七牛云等云服务提供商的存储空间中。 4. 后端上传完毕事件:文件上传完毕后,后端会返回相应的上传结果给前端前端可以进行相关处理,例如提示上传成功或上传失败等。 总之,前端Vue后端Java可以相互配合,实现高效稳定的文件分片上传功能。需要注意的是,在实际项目中,还需要考虑一些安全性和可靠性方面的问题,例如上传速度和可靠性、防止盗链和重复上传等等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值