前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >文件上传到oss代码片段

文件上传到oss代码片段

作者头像
山河木马
发布2019-03-05 18:06:10
24K1
发布2019-03-05 18:06:10
举报
文章被收录于专栏:山河木马山河木马
代码语言:javascript
复制
import axios from '@/global/axios.js'

let expire = 0
let accessKeyId
let policy
let signature
let host
let callback

// 获取policy
function getPolicy (file, filePath, changeSize, callbackImg) {
    // 可以判断当前expire是否超过了当前时间,如果超过了当前时间,就重新取一下.3s 做为缓冲
    let now = new Date().getTime() / 1000
    if (expire < now + 3) {
        axios.get('/api-oss/oss/policy')
            .then((result) => {
            let res = result.data
            if (res.code === 2000) {
            expire = res.data.expire
            accessKeyId = res.data.accessKeyId
            policy = res.data.policy
            signature = res.data.signature
            host = res.data.host
            callback = res.data.callback

            if (file.type.split('/')[0] === 'image') {
                imgChange(file, filePath, changeSize, callbackImg)
            } else {
                callbackOss(file, filePath, callbackImg)
            }
        }
    })
    } else {
        if (file.type.split('/')[0] === 'image') {
            imgChange(file, filePath, changeSize, callbackImg)
        } else {
            callbackOss(file, filePath, callbackImg)
        }
    }
}

// 上传文件到oss
function callbackOss (fileObj, filePath, callbackImg) {
    let formData = new FormData()
    formData.append('key', filePath)
    formData.append('policy', policy)
    formData.append('OSSAccessKeyId', accessKeyId)
    formData.append('success_action_status', '200') // 让服务端返回200,不然,默认会返回204
    formData.append('callback', callback)
    formData.append('signature', signature)
    formData.append('file', fileObj)

    let config = {
        headers: {
            'Content-Type': 'multipart/form-data'
        }
    }
    axios.post(host, formData, config)
        .then(function (result) {
            uploadOss.imgPath = host + '/' + result.data.data.filename
            if (callbackImg) {
                callbackImg()
            }
        })
}

// 图片压缩函数
function imgChange (file, basePath, changeSize, callbackImg) {
    let changeSizeDefault = changeSize || '1'
    let reader = new FileReader()
    let img = new Image()
    reader.readAsDataURL(file)
    reader.onload = function (e) {
        img.src = e.target.result
    }
    let canvas = document.createElement('canvas')
    let context = canvas.getContext('2d')
    img.onload = function () {
        // 图片原生尺寸
        let originWidth = this.width
        let originHeight = this.height

        canvas.width = originWidth
        canvas.height = originHeight

        context.clearRect(0, 0, originWidth, originHeight)
        context.drawImage(img, 0, 0, originWidth, originHeight)
        canvas.toBlob(function (blob) {
            callbackOss(blob, basePath, callbackImg)
        }, file.type || 'image/png', changeSizeDefault)
    }
}

/**
 * 获取文件路径
 * @method getFilePath
 * @param {object} file 文件对象
 * @param {string} basePath 基础路径
 * @return {string} filePath 文件路径
 */
function getFilePath (file, basePath) {
    let filePath = ''
    let fileExtension = getBaseExtension(file.type)
    let filename = getUuid() + '.' + fileExtension
    let basePathRep = replace(basePath)
    if (basePathRep === '') {
        filePath = filename
    } else {
        filePath = basePathRep + '/' + filename
    }
    return filePath
}

// 获取文件扩展名
function getBaseExtension (fileType) {
    if (fileType === 'video/x-ms-wmv') {
        fileType = 'video/wmv' // 对wmv格式的视频文件进行处理
    }
    return fileType.split('/')[1]
}

/**
 * 生成36位 uuid
 * @returns {string} uuid
 */
function getUuid () {
    let s = []
    var hexDigits = '0123456789abcdefhijkmnprstwxyz'
    for (let i = 0; i < 36; i++) {
        s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
    }
    return s.join('')
}

/**
 * 格式化
 * @param str 要格式化的字符串
 * @returns {string}
 */
function replace (str) {
    let replacedStr = str
    let length = replacedStr.length
    if (str.indexOf('/') === 0) {
        if (length === 1) {
            replacedStr = ''
        } else {
            replacedStr = str.substring(1, length)
        }
        length -= 1
    }
    if (length - 1 === replacedStr.lastIndexOf('/')) {
        replacedStr = replacedStr.substring(0, length - 1)
    }
    return replacedStr
}

// 对外接口对象封装
let uploadOss = {
    imgPath: '',
    // file文件上传
    fileInit: function (file, basePath, changeSize, callbackImg) {
        let filePath = getFilePath(file, basePath)
        getPolicy(file, filePath, changeSize, callbackImg)
    }
}

export default uploadOss
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/02/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图片处理
图片处理(Image Processing,IP)是由腾讯云数据万象提供的丰富的图片处理服务,广泛应用于腾讯内部各产品。支持对腾讯云对象存储 COS 或第三方源的图片进行处理,提供基础处理能力(图片裁剪、转格式、缩放、打水印等)、图片瘦身能力(Guetzli 压缩、AVIF 转码压缩)、盲水印版权保护能力,同时支持先进的图像 AI 功能(图像增强、图像标签、图像评分、图像修复、商品抠图等),满足多种业务场景下的图片处理需求。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档