在开始之前,我们先来看看怎么上传一张图片,用的是原生的input标签

<input accept="image/gif,image/jpeg,image/jpg,image/png,image/svg" id="input" type="file" />

这样我们点击的时候就会弹出选择文件的窗口,但是我们业务的时候一般都不会只单单这样用,因为原生的input标签太丑了,那我们可以这样改造一下。这里主要还是用到了And Design。

<input onChange={this.change.bind(this)} accept="image/gif,image/jpeg,image/jpg,image/png,image/svg" style={{ opacity: 0 }} id="input" type="file" />
<Button style={{ marginBottom: 20 }} onClick={this.upload.bind(this)}>
       <Icon type="upload" />点击上传
</Button>

然后它就会变变得像下面这么好看了
图片说明
我们的Button主要的是触发原生input的点击事件。Button点击事件代码如下

upload() {
    const input = document.getElementById('input')
    input.click()
}

然后我们再监听input的onChange事件,代码如下

    change() {
        var reader = new FileReader();
        var AllowImgFileSize = 2100000; //上传图片最大值(单位字节)( 2 M = 2097152 B )超过2M上传失败
        //拿到上传的图片
        var file = document.getElementById('input').files[0];
        var files = file.name.split('.')
        var name = files[files.length - 1]
        var type = ['gif', 'png', 'jpg', 'svg', 'jpeg']
        //判断图片格式
        if (type.indexOf(name) === -1) {
            message.info(`不支持.${name}格式`)
            return
        }
        var imgUrlBase64;
        if (file) {
            //将文件以Data URL形式读入页面
            imgUrlBase64 = reader.readAsDataURL(file);
            reader.onload = function (e) {
                if (AllowImgFileSize !== 0 && AllowImgFileSize < reader.result.length) {
                    message.info('上传失败,请上传不大于2M的图片!');
                    return;
                } else {
                    const input = document.getElementById('value')
                    input.value = reader.result
                }
            }
        }
    }

然后再把生成的base64编码填入一个textarea里面,我们再来多一个复制按钮,点击就自动复制到粘贴板。复制功能的代码如下

copy(value) {
        var currentFocus = document.activeElement; // 保存当前活动节点
        let input = document.createElement('input'); // 创建一个input标签
        document.body.appendChild(input); // 把标签添加给body
        input.style.opacity = 0; //设置input标签设置为透明(不可见)
        input.value = value; // 把需要复制的值放到input上
        // 记录当前滚动位置, 因为添加节点并选中的时候回影响页面滚动
        let scrollY = window.scrollY;
        input.focus(); // input节点获取焦点
        input.setSelectionRange(0, input.value.length); // 选中input框中的所有文字
        var res = document.execCommand('copy', true); // 复制文字并获取结果
        currentFocus.focus(); // 之前活动节点获得焦点
        document.body.removeChild(input); // 删除添加的input节点
        // 页面滚动到之前位置
        window.scrollTo(0, scrollY);
    }