vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
发布时间 - 2026-01-10 23:27:47 点击率:次一、前言

三年.net开发转前端已经四个月了,前端主要用webpack+vue,由于后端转过来的,前端不够系统,希望分享下开发心得与园友一起学习。
图片的上传之前都是用的插件(ajaxupload),或者传统上传图片的方式,各有利弊:插件的问题是依赖jq并且会使系统比较臃肿,还有传统的web开发模式 前后端偶尔在一起及对用户体验要求低,现在公司采用webpack+vue+restfullApi开发模式 前后端完全分离,遵从高内聚,低偶尔的原则,开发人员各司其职,一则提升开发效率(从长期来看,短期对于很多开发人员需要有个适应的过程,特别是初中级的前端处理业务逻辑方面的能力比较欠缺),二则提升用户体验。今天分享下在项目开发中写的的图片上传 vue组件。
二、处理问题
这里用h5做图片上传考虑到浏览器支持的问题,这里考虑的场景是在做webapp的时候
1.移动web图片上传还包括拍摄上传,但是在移动端会出现拍摄的照片会旋转,处理这个问题需要得到图片旋转的情况,可以用exif.js来获取,具体可以参看文档
2.图片压缩
3.旋转
三、代码
1组件代码
<template>
<div>
<input type="file" style="display: none;" id="img-upload" multiple accept="image/*" @change="uploadImg($event)"/>
</div>
</template>
<script>
import EXIF from '../../../Resource/Global/Js/exif'
export default{
name:"image-html5-upload",
props:{
imgArr:{
type:Array,
twoWay: true,
default:Array
},
imgNumLimit:{//一次最多可以上传多少张照片
type:Number,
default:4
}
},
methods:{
"uploadImg": function(e){
let tag = e.target;
let fileList = tag.files;
let imgNum = fileList.length;
let _this = this;
_this.imgArr = [];//图片数据清零
if(this.imgArr.length + imgNum > this.imgNumLimit){
alert('一次最多上传'+this.imgNumLimit+'张图片!');
return;
}
var Orientation;
for(let i=0;i<imgNum;i++){
EXIF.getData(fileList[i], function(){
Orientation = EXIF.getTag(fileList[i], 'Orientation');
});
let reader = new FileReader();
reader.readAsDataURL(fileList[i]);
reader.onload = function(){
var oReader = new FileReader();
oReader.onload = function(e) {
var image = new Image();
image.src = e.target.result;
image.onload = function() {
var expectWidth = this.naturalWidth;
var expectHeight = this.naturalHeight;
if (this.naturalWidth > this.naturalHeight && this.naturalWidth > 800) {
expectWidth = 800;
expectHeight = expectWidth * this.naturalHeight / this.naturalWidth;
} else if (this.naturalHeight > this.naturalWidth && this.naturalHeight > 1200) {
expectHeight = 1200;
expectWidth = expectHeight * this.naturalWidth / this.naturalHeight;
}
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
canvas.width = expectWidth;
canvas.height = expectHeight;
ctx.drawImage(this, 0, 0, expectWidth, expectHeight);
var base64 = null;
//修复ios上传图片的时候 被旋转的问题
if(Orientation != "" && Orientation != 1){
switch(Orientation){
case 6://需要顺时针(向左)90度旋转
_this.rotateImg(this,'left',canvas);
break;
case 8://需要逆时针(向右)90度旋转
_this.rotateImg(this,'right',canvas);
break;
case 3://需要180度旋转
_this.rotateImg(this,'right',canvas);//转两次
_this.rotateImg(this,'right',canvas);
break;
}
}
base64 = canvas.toDataURL("image/jpeg", 0.8);
if(fileList[i].size / 1024000 > 1){
_this.imgScale(base64, 4)
}else{
_this.imgArr.push({"src": base64});
}
console.log(JSON.stringify(_this.imgArr));
};
};
oReader.readAsDataURL(fileList[i]);
}
}
},
"imgScale": function(imgUrl,quality){
let img = new Image();
let _this = this;
let canvas = document.createElement('canvas');
let cxt = canvas.getContext('2d');
img.src = imgUrl;
img.onload = function(){
//缩放后图片的宽高
let width = img.naturalWidth/quality;
let height = img.naturalHeight/quality;
canvas.width = width;
canvas.height = height;
cxt.drawImage(this, 0, 0, width, height);
_this.imgArr.push({"src": canvas.toDataURL('image/jpeg')});
}
},
"rotateImg":function (img, direction,canvas) {//图片旋转
var min_step = 0;
var max_step = 3;
if (img == null)return;
var height = img.height;
var width = img.width;
var step = 2;
if (step == null) {
step = min_step;
}
if (direction == 'right') {
step++;
step > max_step && (step = min_step);
} else {
step--;
step < min_step && (step = max_step);
}
var degree = step * 90 * Math.PI / 180;
var ctx = canvas.getContext('2d');
switch (step) {
case 0:
canvas.width = width;
canvas.height = height;
ctx.drawImage(img, 0, 0);
break;
case 1:
canvas.width = height;
canvas.height = width;
ctx.rotate(degree);
ctx.drawImage(img, 0, -height);
break;
case 2:
canvas.width = width;
canvas.height = height;
ctx.rotate(degree);
ctx.drawImage(img, -width, -height);
break;
case 3:
canvas.width = height;
canvas.height = width;
ctx.rotate(degree);
ctx.drawImage(img, -width, 0);
break;
}
}
}
}
</script>
2.使用方法
<template>
<div>
<div class="album-img-list">
<ul>
<li v-for="img in imgList"><div class="album-bg-img"><img :src='img.src'> </div></li>
</ul>
</div>
<div class="album">
<label for="img-upload">上传照片</label>
<image-html5-upload :img-arr.sync="imgList"></image-html5-upload>
</div>
</div>
</template>
以上所述是小编给大家介绍的vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# vue
# 组件开发
# h5
# 拍照上传
# Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
# Vue.js 2.0 移动端拍照压缩图片预览及上传实例
# vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
# Vue.js 2.0 移动端拍照压缩图片上传预览功能
# Vue调用PC摄像头实现拍照功能
# vue调取电脑摄像头实现拍照功能
# vue调用本地摄像头实现拍照功能
# vue实现pc端拍照上传功能
# 图片上传
# 上传
# 最多
# 后端
# 开发人员
# 小编
# 上传图片
# 都是
# 是在
# 有个
# 在此
# 各司其职
# 可以用
# 两次
# 给大家
# 问题是
# 考虑到
# 各有
# 会使
# 所述
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何快速搭建高效服务器建站系统?
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
Laravel如何优化应用性能?(缓存和优化命令)
香港服务器网站推广:SEO优化与外贸独立站搭建策略
免费网站制作appp,免费制作app哪个平台好?
Laravel如何实现用户密码重置功能?(完整流程代码)
如何用IIS7快速搭建并优化网站站点?
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
JS经典正则表达式笔试题汇总
如何正确选择百度移动适配建站域名?
Android实现代码画虚线边框背景效果
jquery插件bootstrapValidator表单验证详解
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
网站制作免费,什么网站能看正片电影?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel如何实现API版本控制_Laravel版本化API设计方案
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
如何在云服务器上快速搭建个人网站?
js实现点击每个li节点,都弹出其文本值及修改
javascript基于原型链的继承及call和apply函数用法分析
Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】
简历没回改:利用AI润色让你的文字更专业
如何用美橙互联一键搭建多站合一网站?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
北京的网站制作公司有哪些,哪个视频网站最好?
高端网站建设与定制开发一站式解决方案 中企动力
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
Android自定义listview布局实现上拉加载下拉刷新功能
大型企业网站制作流程,做网站需要注册公司吗?
zabbix利用python脚本发送报警邮件的方法
如何构建满足综合性能需求的优质建站方案?
高端智能建站公司优选:品牌定制与SEO优化一站式服务
东莞专业网站制作公司有哪些,东莞招聘网站哪个好?
Laravel如何记录自定义日志?(Log频道配置)
如何在搬瓦工VPS快速搭建网站?
如何打造高效商业网站?建站目的决定转化率
如何在阿里云虚拟服务器快速搭建网站?
Laravel Docker环境搭建教程_Laravel Sail使用指南
中山网站推广排名,中山信息港登录入口?
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
如何快速生成凡客建站的专业级图册?
网易LOFTER官网链接 老福特网页版登录地址
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议
如何快速生成专业多端适配建站电话?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?

