热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

vue前端上传文件到阿里云oss的两种方式,put文件流上传,multipartUpload直接上传

引入阿里云oss的js

引入阿里云oss的js

如果图片要用canvas做压缩, 得到的是base64数据,要转换成blob对象,再转为buffer流。用put上传
有些手机不支持canvas直接转为blob对象可以引入canvas-to-blob.min.js 将canvas转为blob对象
blob插件地址: https://github.com/blueimp/Ja…
获得图片的方向,引入exif.js
exif.js 官网地址 http://code.ciaoca.com/javasc…
项目中都是用标签直接在index.html中引用的

pushFile (file) {
let that = this
if (['jpeg', 'png', 'jpg'].indexOf(file.type.split('/')[1]) <0) {
alert('只支持jpg/png格式的图片')
return false
}
// orient=>照片的角度
/* global EXIF */
let orient
EXIF.getData(file, function () {
orient = EXIF.getTag(this, 'Orientation')
})
// 压缩图片需要的一些元素和对象
let reader = new FileReader()
let img = new Image()
// 选择得是图片
if (file.type.indexOf('image') === 0) {
reader.readAsDataURL(file)
}
// 缩放图片需要的canvas
let canvas = document.createElement('canvas')
let cOntext= canvas.getContext('2d')
// base64 地址加载完后
img.Onload= function () {
// 图片原始尺寸
let originWidth = this.width
let oringinHeight = this.height
// 最大尺寸限制
let maxWidth = 800
let maxHeight = 800
// 目标尺寸
let targetWidth = originWidth
let targetHeight = oringinHeight
// 图片尺寸超过800x800的限制
if (originWidth > maxWidth || oringinHeight > maxHeight) {
if (originWidth / oringinHeight > maxWidth / maxHeight) {
// 更宽
targetWidth = maxWidth
targetHeight = Math.round(maxWidth * (oringinHeight / originWidth))
} else {
targetHeight = maxHeight
targetWidth = Math.round(maxHeight * (originWidth / oringinHeight))
}
}
// canvas 对图片进行缩放
canvas.width = targetWidth
canvas.height = targetHeight
// 清除画布
context.clearRect(0, 0, targetWidth, targetHeight)
// 图片压缩
context.drawImage(img, 0, 0, targetWidth, targetHeight)
if (orient !== '' && orient !== 1) {
// orient === 1是正常的
switch (orient) {
case 6: // 需要顺时针向左90度旋转
that.rotateImg(img, 'left', canvas, targetWidth, targetHeight)
break
case 8: // 需要逆时针向右90度旋转
that.rotateImg(img, 'right', canvas, targetWidth, targetHeight)
break
case 3: // 需要180度旋转
that.rotateImg(img, 'right', canvas, targetWidth, targetHeight)
that.rotateImg(img, 'right', canvas, targetWidth, targetHeight)
break
}
}
if (canvas.toBlob) {
canvas.toBlob(function (blob) {
// 在这里实现上传操作
let reader2 = new FileReader()
reader2.readAsArrayBuffer(blob)
reader2.Onload= function (event) {
let buffer = new OSS.Buffer(event.target.result)
that.client.put(storeAs, buffer).then((result) => {
if (result.url) {
// 获得图片地址
that.src= result.url
}
}).catch((err) => {
console.log(err)
alert('上传失败, 请重新上传')
})
}
}, file.type || 'image/png')
}
}
rotateImg (img, direction, canvas, targetWidth, targetHeight) {
// 最小与最大旋转方向,图片旋转4次后回到原方向
var minstep = 0
var maxstep = 3
if (img === null) return
// img的高度和宽度不能在img元素隐藏后获取,否则会出错
var step = 2
if (step === null) {
step = minstep
}
if (direction === 'right') {
step++
// 旋转到原位置,即超过最大值
step > maxstep && (step = minstep)
} else {
step--
step }
// 旋转角度以弧度值为参数
let degree = step * 90 * Math.PI / 180
var ctx = canvas.getContext('2d')
switch (step) {
case 0:
canvas.width = targetWidth
canvas.height = targetHeight
ctx.clearRect(0, 0, targetWidth, targetHeight)
ctx.drawImage(img, 0, 0, targetWidth, targetHeight)
break
case 1:
canvas.width = targetHeight
canvas.height = targetWidth
ctx.rotate(degree)
ctx.clearRect(0, 0, targetHeight, targetWidth)
ctx.drawImage(img, 0, -targetHeight, targetWidth, targetHeight)
break
case 2:
canvas.width = targetWidth
canvas.height = targetHeight
ctx.rotate(degree)
ctx.clearRect(0, 0, targetWidth, targetHeight)
ctx.drawImage(img, -targetWidth, -targetHeight, targetWidth, targetHeight)
break
case 3:
canvas.width = targetHeight
canvas.height = targetWidth
ctx.rotate(degree)
ctx.clearRect(0, 0, targetHeight, targetWidth)
ctx.drawImage(img, -targetHeight, 0, targetWidth, targetHeight)
break
}
}
}

推荐阅读
  • 本文主要讨论了如何通过已知图片的base64流将图片上传到文件服务器并返回URL的问题。通过模拟文件上传过程,成功解决了该问题。然而,在返回的URL中出现了一个名为blob的文件,作者对于该文件的具体含义以及base64转blob格式的意义有所困惑。本文将对这些问题进行探讨和解答。 ... [详细]
  • VUE中引用路径的配置
    在vue项目开发中经常引用JS、CSS、IMG文件。当项目较大时文件层级很多,导致路径很长,我们可以通过在bulidwebpack.base.conf.js设置简便的引用路径一、 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
  • 详解 Python 的二元算术运算,为什么说减法只是语法糖?[Python常见问题]
    原题|UnravellingbinaryarithmeticoperationsinPython作者|BrettCannon译者|豌豆花下猫(“Python猫 ... [详细]
  • 原文:http:blog.linjunhalida.comblogpjaxgithub:https:github.comdefunktjquery-pjax ... [详细]
  • python实现内容写在图片上的方法
    这篇文章主要介绍python实现内容写在图片上的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体代码内容如下:#-*-co ... [详细]
  • return 语句竟然跳不出 for 循环?怎么肥事?
    松哥最近正在录制TienChin项目视频~采用SpringBoot+Vue3技术栈,里边会涉及到各种好玩 ... [详细]
  • requestLayout()引起的问题网上有大量写的很深入的requestLayout()源码分析的文章。故这里不再写了,只做一个实际情况下遇到的问题的分析。起因:自定义了一个C ... [详细]
  • 1、运行npmrundev命令在cmd上面也不算报错输出一些东西看不懂什么意思。报错页: ... [详细]
author-avatar
恋是一种潮流
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有