<input type="file">------在vue中我们可以给input控件一个ref属性,然后我们可以使用this.$refs.(前面这家伙的属性值,其实就是一个锚点)去得到这个控件,然后去调用这个控件的files属性,我们就可以拿到控件里面获取到的数据了。当然,他是一个对象,这个数据也是存储在对象的一个属性当中,具体啥的自己去打印看看。然后这个对象有个name属性,顾名思义,就是你得到的文件名,还有一个属性是length,我们可以利用这个属性去判断控件到底里面有没有数据。如果你自己去做过,你会发现有下面一种场景。

------场景场景场景--------

1.第一次用控件获取一张图片,我们看到控件获取到了数据

2.第二次点开同样的控件,但是.....

3.我啥也不选

4.控件里面原来的数据被清空了,貌似从来没来过这个世上

这显然不太友好,于是动动脑子,你可以这么做

    data () {
       return {
          fileName: null
      }
   }

-----------------------------------------------------------------------------

if (this.$refs.imgFile.files.length !== 0) {
   this.fileImg = this.$refs.imgFile.files
} else { this.$refs.imgFile.files = this.fileImg return }

上面是vue的写法,因为最近用vue写项目,所以偷个懒。用原生的话做的方式一模一样

好了,现在你会发现,不会再有上面那种非友好的用户体验了,当然这个因人而异,有人说这是个fetch,我觉得它很多时候是个bug.....

我们接着唠

接下来,我们会生成一个图片对象,你可以用createElement的方式或者用new Image的方式,这个不纠结

请看这里

let imgRender = new FileReader()//用来把文件读入内存,并且读取文件中的数据。FileReader接口提供了一个异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据
imgRender.readAsDataURL(file)//将文件读取为DataURL

 具体文献链接:http://blog.csdn.net/zk437092645/article/details/8745647

如果你问什么是dataurl,我建议你自己先去找文章看看吧,我这有一篇不错的文章链接你可以看看:http://www.webhek.com/post/data-url.html

然后,我们利用canvas,先设置大小,于是可以这么做

let canvas = document.createElement('canvas')
canvas.width = targetWidth
canvas.height = targetHeight

我记得canvas对象默认的宽度是300,高度是150,你自己可以打印看看

然后我们做下面一件事

let canvasCtx = canvas.getContext('2d')

为了省去某些同学去翻资料,我解释下啥意思===>指定了您想要在画布上绘制的类型。当前唯一的合法值是 "2d",它指定了二维绘图,并且导致这个方法返回一个环境对象,该对象导出一个二维绘图 API(这是网上的解释,我只是个搬运工)。

然后我们用这个对象的fillRect方法,可以设定这个环境对象的横坐标、纵坐标、宽度、高度。然后是最后一步,用drawImage方法向画布上绘制图像、画布或视频。就像下面

canvasCtx.fillStyle = '#fff'
canvasCtx.fillRect(0, 0, canvas.width, canvas.height)// set the default background color of png  to white
canvasCtx.drawImage(图片对象files[0], 0, 0, targetWidth, targetHeight)

OK,这面的步骤很简单有木有。总的来说,我们还是用canvasCtx环境对象做一些'动作'

接下来的动作就很简单了,咱们看下面

let picBase64 = canvas.toDataURL('image/jpeg', 1)//canvas里面是二进制二进制2222222222222
let fd = new FormData()
let blob = ImgUtil.base64ToBlob(picBase64)//不是blob,你传不了,这里不多解释这个,网上解释很多----你可以用atob()这个方法来,但是这个方法有挺大的缺陷,不过兼容性很好了,而且
你要对它进行切割切割,因为前面会有些emmit----》九九归一,来个new Blob()统统搞定 fd.append(
'pic', blob)

 OK,到这里,你可以拿上你的接口,把这东西甩过去了。当然,并不是所有情况都是这样子,你得和你的后端小伙伴协定好,到底要什么样的数据。

posted on 2017-11-16 09:45  维尼-winnie  阅读(187)  评论(0编辑  收藏  举报