使用vue进行移动端上传图

使用input[type=file]进行移动端图片上传。 

html

<div class="header">
                <img class="MeImg0" src="../assets/img/upload_pictures@2x.png" alt="">
                <input type="file" @change="uploadImg($event)" />
            </div>

js

uploadImg(e) {
            var tag = e.target;
            var fileList = tag.files;
            var _this = this;
            var reader = new FileReader();
            reader.readAsDataURL(fileList[0]);
            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;
                        }

                        //canvas 绘制图片 
                        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;
                        base64 = canvas.toDataURL("image/jpeg", 0.5);
                        if (fileList[0].size / 2097152 > 1) {
                            _this.imgScale(base64, 5)
                        }
                        else {
                            //ajax请求,通过formdata进行上传图片 
                            var formdata = new FormData();
                            var blob = _this.dataURItoBlob(base64);
                            formdata.append('file', blob, 'image.png');


                            // 这里发请求,进行图片上传
                        }
                    };
                };
                oReader.readAsDataURL(fileList[0]);
            }
        },
//缩放图片,防止图片宽高过大 
        imgScale(imgUrl, quality) {
            var img = new Image();
            var _this = this;
            var canvas = document.createElement('canvas');
            var cxt = canvas.getContext('2d');
            img.src = imgUrl;
            img.onload = function() {
                //缩放后图片的宽高
                var width = img.naturalWidth / quality;
                var height = img.naturalHeight / quality;
                canvas.width = width;
                canvas.height = height;
                cxt.drawImage(this, 0, 0, width, height);
                //ajax请求,通过formdata进行上传图片 
                var formdata = new FormData();
                var blob = dataURItoBlob(canvas.toDataURL('image/jpeg'));
                formdata.append('file', blob, 'image.png');


                 // 这里发请求,进行图片上传
            }
        },
// 创建一个Blob对象 用于将base64转化为formdata
        dataURItoBlob(base64Data) {
            var byteString;
            if (base64Data.split(',')[0].indexOf('base64') >= 0) {
                byteString = window.atob(base64Data.split(',')[1]);
            }
            else {
                byteString = unescape(base64Data.split(',')[1]);
            }
            var mimeString = base64Data.split(',')[0].split(':')[1].split(';')[0];  //type
            //处理异常,将ascii码小于0的转换为大于0
            var ab = new ArrayBuffer(byteString.length); //size
            var ia = new Uint8Array(ab);
            for (var i = 0; i < byteString.length; i++) {
                ia[i] = byteString.charCodeAt(i);
            }
            return new Blob([ab], { type: mimeString });
        }

以上方法解决了图片的上传和压缩,但是在ios手机上回出现图片旋转问题。可以参考下面这一篇文章。

https://blog.csdn.net/xiaogezl/article/details/70156500#

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值