IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 图片文件的离线缓存(base64存储、转File文件上传) -> 正文阅读

[JavaScript知识库]图片文件的离线缓存(base64存储、转File文件上传)

存储图片文件

以localStorage为例、无法存储文件引用对象;即使我们存了,或者使用JSON.stringfy转化,在获取的时候,也只能获取到一个空对象;

因为localStorage只能存储字符串、所以我们可以先把图片、转化为base64去存储;
在需要使用的时候在转化base64为文件对象;

其实存储图片这个需求、也不应该是通过localStorage去存储、因为对应浏览器都有相应大小的限制、只有5M左右;可以使用indexDB或其他存储手段

转化图片为base64格式

这里我做的业务时页面代码、需要存储选中的图片文件、也就是将文件转化为base64!

	  const uploadFile = async (file) => {
		    const fileReader = new FileReader();
		    fileReader.onload = function () {
		      const result = this.result; //文件内容
			  // 在此处拿到的即为base64格式内容
		    }
		    fileReader.readAsDataURL(file);
  };

如果是直接转对应的图片存储为以下代码

// 转base64方法
export const getBase64Image = (img) => {
  const canvas = document.createElement('canvas');
  canvas.width = img.width;
  canvas.height = img.height;
  const ctx = canvas.getContext('2d');
  ctx.drawImage(img, 0, 0, img.width, img.height);
  const ext = img.src.substring(img.src.lastIndexOf('.') + 1).toLowerCase();
  const dataURL = canvas.toDataURL('image/' + ext);
  return dataURL;
};

使用

const image = new Image();
image.crossOrigin = 'Anonymous';
image.src = '图片地址';
image.onload = function () {
  var base64 = getBase64Image(image);
  console.log(base64);
};

以上拿到base64数据、如果我们的接口支持base64上传、那就直接用此base64上传即可、我们的项目因为使用的是公共服务、所以没人愿意在单独写接口了、那也问题不大、我们在将base64转回来;

如果直接使用new File转化,在ios会有一些兼容问题、所以我们使用如下方法转化、先将base64转华为blob、在将blob数据转化为File文件

	// 将base64转化为blob对象
	export const dataURLtoBlob = (base64Data) => {
	  var arr = base64Data.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 Blob([u8arr], { type: mime });
	};
	// 将blob转化为File文件
	export const blobToFile = (theBlob, fileName) => {
	  // 这里直接使用theBlob设置自身属性会有eslint no-param-reassign报错、不能直接改变参数对象数据、所以这里使用Reflect代理
	  Reflect.set(theBlob, 'lastModifiedDate', new Date());
	  Reflect.set(theBlob, 'name', fileName);
	  return theBlob;
	};

使用

	const blob = dataURLtoBlob(base64Data);
    const file = blobToFile(blob, '对应文件名');
    const formData = new FormData();
    formData.append('file', file);
    ...

以上

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-31 23:55:34  更:2022-03-31 23:56:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:07:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码