前面写的一些项目直接使用angular+ant.design就直接上传图片,使用的是ant的默认上传的组件,即提供url,然后上传的时候直接将二进制文件上传到服务器,然后服务器通过文件流的形式去接受,然后做其他的操作,上传好后返回文件的url,然后我们前端继续我们的操作。这个过程是很省心的,我们只需要提供一个上传url,然后做些上传限制,最后接收返回值。但是假如我们需要上传的是base64之后的数据,怎么办?
我们需要做的事:
- 接收图片文件(使用ant.design的自定义上传)
- 将图片文件转换为base64
- 将base64的图片为参数传递给接口
- 获得接口的返回值,并显示到前端页面
接收上传图片
使用ant.design的自定义上传模式:
1 | <nz-upload |
上面的beforUpload
用来限制上传的类型以及大小,[nzCustomRequest]="handleUpload"
里面的handleUpload
才是上传图片的方法。
beforeUpload
不用多说,ant.design的文档里面有清楚的示例,我们主要来看handleUpload
方法,官网上的描述:
nzCustomRequest 通过覆盖默认的上传行为,可以自定义自己的上传实现;注意:务必使用 => 定义处理方法。 (item) => Subscription
该方法需要始终返回一个Subscription
对象,nz-upload
会在适当时机自动取消订阅。那么我们可以先定义一个函数的壳:
1 | handleUpload = (item: UploadXHRArgs): Subscription => { |
我们在函数里面创建了一个可订阅对象Subject
,然后返回了这个可订阅对象的Subscription
对象。我们只需要在特定的地方发出值:subject.next(value)
,就可以了。
我们可以在这个方法的item.file
里取得当前上传的图片文件。所以我们第一步算是完成了。
转换图片为base64格式
如何将用户上传的图片转换为base64格式?这就需要FileRender
了。
FileRender
对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容。使用File
或Blob
对象指定要读取的文件或数据。— MDN web docs FileRender
我们可以使用FileRender
来加载用户选择上传的图片,然后进行我们需要的处理。
我们先实现一个读取图片文件的方法,由于读取文件是异步操作,所以我们使用返回Observable的方式,当读取成功,并获得base64编码的字符串后就返回Observable通知上层调用:
1 | read(file: File): Observable<string> { |
然后在我们的handleUpload
方法中调用:
1 | handleUpload = (item: UploadXHRArgs) => { |
这里imgSrc
的作用是在html中绑定一个img
元素,当读取并转化成功后,就显示这个图片:
1 | <img [src]="imgSrc" /> |
将base64的图片为参数传递给接口
我们已经获得到base64的图片的参数了,只需要传递给接口就可以了,接口正常调用。不过需要注意的是,采用formData形式传递参数的时候需要对参数进行urlencode
,要不然服务器就乱套了。
正常调用接口:
1 |
|
获得接口的返回值,并显示到前端页面
从上面接口中获得返回值即可,然后显示到页面上
刚开始做的时候以为一定要通过canvas才可以转换,原来想多了,直接通过FileRender
进行加载,然后通过FileRender.readAsDataURL(file)
就可以读取到图片的base64编码的字符串。这里倒是研究了如何在异步的情况通过Observable进行消息通知。通过Canvas可以实现图片的大小剪贴等操作,后续有机会可以了解了解。