input上传图片

1、上传图片

<head>
    <meta charset="UTF-8">
    <title>Blob Test</title>
    <script>

        function handleFile1(inputDom) {
            var file = inputDom.files[0];
            // createObjectURL传入File类型的数据创建url,可以在浏览器看到网络请求
            var ObjectURL = URL.createObjectURL(file);
            var img1  = document.querySelector('.img1');
            img1.src = ObjectURL;
            img1.onload = function(img) {
                URL.revokeObjectURL(this.src);  // 释放createObjectURL创建的对象##
            }
        }
        
        function handleFile2(inputDom) {
            var file = inputDom.files[0];
            // readAsDataURL读取文件,直接返回url,可以在浏览器看到网络请求
            var img2  = document.querySelector('.img2');
            var fileReader = new FileReader();
            fileReader.readAsDataURL(file);
            fileReader.onload = function(e) {
                console.log(e.target.result);  // 上传的图片的编码,如果要传给服务器传的就是这个
                img2.src = e.target.result;
            }

        }
    
        function handleFile3(inputDom) {
            var file = inputDom.files[0];
            // 创建Blob
            var img3  = document.querySelector('.img3');
            var fileReader3 = new FileReader();
            fileReader3.readAsDataURL(file);
            fileReader3.onload = function(e) {
                var dataUrl = e.target.result; // base64编码的dataURL类型数据
                var index = dataUrl.indexOf(',');

                // 获取MIME类型
                var mimeContainer = dataUrl.substr(0, index);
                var mime = mimeContainer.match(/:(image\/[a-z]+);base64/)[1];

                // 创建Blob,atob:对 base64 编码过的字符串进行解码。
                var data = atob(dataUrl.substr(index + 1));
                var dataLength = data.length;
                var u8arr = new Uint8Array(dataLength);
                while(dataLength--){
                    u8arr[dataLength] = data.charCodeAt(dataLength); // 转成Unicode编码后存储
                }

                var blob = new Blob([u8arr], {type:mime});

                // 获取objectURL
                var objectURL = URL.createObjectURL(blob);
                console.log(objectURL);
                img3.src = objectURL;
            }
        }
    </script>
</head>

<body>
    <div style="color:red; padding-bottom:20px">上传图片的3种方法</div>
    <img style="width:200px;height:200px" class='img1' alt="handleFile1" />
    <input type="file" accept="image/*" onchange="handleFile1(this)" />
    <br />
    <img style="width:200px;height:200px" class='img2' alt="handleFile1" >
    <input type="file" accept="image/*" onchange="handleFile2(this)" />
    <br/>
    <img style="width:200px;height:200px" class='img3' alt="handleFile1" >
    <input type="file" accept="image/*" onchange="handleFile3(this)" />
</body>

</html>

参考:

1、https://segmentfault.com/a/1190000011563430 (专栏 -> 老干部的大前端)

2、https://blog.csdn.net/xingyun89114/article/details/80699527

 

2、JavaScript用btoa和atob来编码解码Base64

btoa和atob是window对象的两个函数,其中btoa是binary to ascii,用于将binary的数据用ascii码表示,即Base64的编码过程,而atob则是ascii to binary,用于将ascii码解析成binary数据,看一个例子:

// Define the string
var string = 'Hello World!';

// Encode the String
var encodedString = btoa(string);
console.log(encodedString); // Outputs: "SGVsbG8gV29ybGQh"

// Decode the String
var decodedString = atob(encodedString);
console.log(decodedString); // Outputs: "Hello World!"

但是,atob和btoa不能编码Unicode字符:

var string = "Hello, 中国!";
window.btoa(string); // 这个会报error

解决方案:先将带有非Latin1字符的串先用encodeURIComponent编码:

var string = "Hello, 中国!";
//"SGVsbG8lMkMlMjAlRTQlQjglQUQlRTUlOUIlQkQlRUYlQkMlODE="
var encodedString = btoa(encodeURIComponent(string));
var decodedString = decodeURIComponent(atob(encodedString));
console.log(decodedString); //"Hello, 中国!"

参考:

1、https://my.oschina.net/itblog/blog/1613977

2、https://developer.mozilla.org/zh-CN/docs/Web/API/WindowBase64/btoa

3、https://blog.coding.net/blog/resolve-atob-decode-chinese-character-outputting-messy-code-problem-in-javascript

4、https://www.jb51.net/article/108957.htm

5、https://blog.csdn.net/xichenguan/article/details/51234093

6、https://www.cnblogs.com/fangsmile/p/7736788.html (DataURL与File,Blob,canvas对象之间的互相转换的Javascript

7、https://blog.csdn.net/charleslei/article/details/50993861(字符编码笔记:ASCII、Unicode、UTF-8 和 Base64)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值