赞
踩
ArrayBuffer用来表示通用的固定长度的原始二进制数据缓冲区
他是一个字节数组,在别的语音称为byteArray
不可以直接使用,要转化为TypedArray或Dataview对象来操作
通过这些格式来读取内容
一个类型化数组(TypedArray)对象描述了一个底层的二进制数据缓冲区
(binary data buffer)的一个类数组视图(view)
它本身不可以被实例化,甚至无法访问,可以理解为接口
DataView 视图是一个可以从 二进制ArrayBuffer
对象中读写多种数值类型的底层接口,
使用它时,不用考虑不同平台的字节序问题。
var debug = { hello: "world" };
var blob = new Blob([JSON.stringify(debug, null, 2)],
{ type: 'application/json' });
File 对象是来自用户在一个 <input> 元素上选择文件后返回的
FileList 对象,也可以是来自由拖放操作生成的 DataTransfer
对象或者来自 HTMLCanvasElement 上的 mozGetAsFile() API。
文件预览 function previewFile() { var preview = document.querySelector('img'); var file = document.querySelector ('input[type=file]').files[0]; var reader = new FileReader(); reader.addEventListener("load", function () { preview.src = reader.result; }, false); if (file) { reader.readAsDataURL(file); } } reader.readAsDataURL() data:URL格式的Base64字符串以表示所读取文件的内容。 *注意***不可用于文件上传,应为太大了 应该把base64转码 reader.readAsText() 字符串的文件内容。默认utf-8 ```kk # 7.URL.createObjectURL ```powershell objectURL = URL.createObjectURL(object); 这个新的URL 对象表示指定的 File 对象或 Blob 对象 你可以像使用普通URL那样使用它,比如用在img.src 上。 URL.revokeObjectURL(objectURL) 让浏览器知道不再保留对文件的引用 不可用于文件上传,应为他只是一个文件的引用
完整的代码案例
前端代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <input type="file" id="input" οnchange="handleFiles(this.files)"> <script> const inputElement = document.getElementById("input"); inputElement.addEventListener("change", handleFiles, false); function handleFiles() { const fileList = this.files; /* now you can work with the file list */ //new 一个文件阅读对象 var reader = new FileReader(); //监听转化成功的回调函数,监听load后的函数 reader.addEventListener("load", function () { //得到字节数组 let bytes = atob(reader.result.split(',')[1]); //获取文件类型 let mime = reader.result.split(',')[0].match(/:(.*?);/)[1] //创建一个长度为n的buffer let arrayBuffer = new ArrayBuffer(bytes.length); //转化为8个字节的类型数组,描述了一个底层的二进制数据缓冲区 let uInt8Array = new Uint8Array(arrayBuffer); for (let i = 0; i < bytes.length; i++) { //填充转化后的阿斯克码 uInt8Array[i] = bytes.charCodeAt(i); } //生成一个bolb类型 let blob = new Blob([uInt8Array], { type: mime }) let xhr = new XMLHttpRequest; //以表单的形式向后端传递 let formData = new FormData(); //名 , blob值 formData.append('avatar', blob); xhr.open('post', 'http://localhost:8080/upload', true); xhr.send(formData); }, false); if (fileList[0]) { //读取,上传的文件为 转化为base64 //在这里转化成功,会监听load事假 reader.readAsDataURL(fileList[0]); } } </script> </body> </html>
服务端代码 let express = require('express'); let path = require('path'); let cors = require('cors'); let app = express(); app.use(cors()) app.use(express.static(path.join(__dirname, 'public'))) const multer = require('multer'); //uploads文件存放的地址,没有会报错 //上传的图片会自动保存再这个文件夹 app.use(multer({ dest: './uploads' }).single('avatar')) // 名字 不对或者个数不对都会报此错 // MulterError: Unexpected field at wrappedFileFilterat Busboy. app.post('/upload2', upload.array('pic', 5), function (req, res) { res.send('upload ok!'); }); app.post('/upload', function (req, res) { console.log(req.file, req.body) res.json({ sucess: true }) }) app.listen(8080, () => { console.log('成功') })
function dataURLtoFile(dataurl, filename)
{
var arr = dataurl.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new File([u8arr], filename, {type:mime});
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。