buffer和图片的预览上传和base64的转码和解码

1.ArrayBuffer

ArrayBuffer用来表示通用的固定长度的原始二进制数据缓冲区
他是一个字节数组,在别的语音称为byteArray
不可以直接使用,要转化为TypedArray或Dataview对象来操作
通过这些格式来读取内容

2.TypedArray

一个类型化数组(TypedArray)对象描述了一个底层的二进制数据缓冲区
(binary data buffer)的一个类数组视图(view)
它本身不可以被实例化,甚至无法访问,可以理解为接口

3.DataView

DataView 视图是一个可以从 二进制ArrayBuffer
对象中读写多种数值类型的底层接口,
使用它时,不用考虑不同平台的字节序问题。

4.Blob

  1. bolb对象表示一个不可变、原始数据的类文件对象。
  2. 它的数据可以按文本或二进制的格式进行读取,
  3. 也可以转换成 ReadableStream 来用于数据操作。
  4. 一种从Blob中读取内容的方法是使用 FileReader
  5. file对象 和blob对象,File 接口基于Blob,
  6. file继承了 blob 的功能并将其扩展使其支持用户系统上的文件。
var debug = { hello: "world" };
var blob = new Blob([JSON.stringify(debug, null, 2)],
            { type: 'application/json' });

5.file对象

File 对象是来自用户在一个 <input> 元素上选择文件后返回的 

FileList 对象,也可以是来自由拖放操作生成的 DataTransfer

对象或者来自 HTMLCanvasElement 上的 mozGetAsFile() API。

6. FileReader

文件预览
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)
让浏览器知道不再保留对文件的引用

不可用于文件上传,应为他只是一个文件的引用

8. base64的转码和解码

完整的代码案例

前端代码
<!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('成功')
})

将base64转换为文件 直接newFile


 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});
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 JSP 上传图片的步骤如下: 1. 在 JSP 页面中添加一个表单,包含一个 input 标签用于选择图片文件,以及一个 submit 按钮用于提交表单。 ``` <form action="upload.jsp" method="post" enctype="multipart/form-data"> <input type="file" name="image" /> <input type="submit" value="上传" /> </form> ``` 2. 在 upload.jsp 页面中获取上传图片文件,并保存到服务器本地的一个目录中。 ``` <% String savePath = "E:/upload"; // 上传文件的保存路径 File file = new File(savePath); if (!file.exists()) { file.mkdirs(); } String fileName = request.getParameter("image"); // 获取上传的文件名 InputStream is = request.getPart("image").getInputStream(); // 获取上传的文件流 FileOutputStream fos = new FileOutputStream(savePath + "/" + fileName); // 创建输出流 byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { fos.write(buffer, 0, len); // 写入文件 } fos.close(); is.close(); %> ``` 以上代码将上传图片保存到了 E:/upload 目录下,文件名为上传时的文件名。当然,你需要根据自己的实际情况修改代码中的保存路径。 注意:由于 form 表单中指定了 enctype="multipart/form-data",因此在获取上传文件时需要使用 request.getPart() 方法,而不是 request.getParameter() 方法。 3. 在 JSP 页面中添加提示信息,告诉用户上传成功。 ``` <% out.println("上传成功!"); %> ``` 至此,JSP 上传图片的实现就完成了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值