chrome扩展在popup、background、content之间通信解决传输文件问题

news2024/11/13 16:01:58

文章目录

  • 背景介绍
  • 案例介绍
  • 代码示例
    • popup页面,上传文件页面
    • popup页面,js上传代码,file文件转base64
    • background监听消息,base64转file文件,axios上传
  • 附-转base64后直接下载

背景介绍

        示例扩展API版本MV2。
        以弹出窗口(popup)和背景页面(background page)为例。
        在浏览器中,弹出窗口(popup)和背景页面(background page)之间可以通过消息通道进行通信。但是,由于安全限制,弹出窗口不能直接访问背景页面的文件系统或进行文件传输。
        然而,可以使用一些方法来实现弹出窗口向背景页面传输文件,就是在popup页面将文件转为base64的字符串格式向background传输,然后再将base64重新转为file对象,达到传输文件的目的。

案例介绍

        从popup页面选择文件开始上传,触发上传按钮后,获取到选择的文件并将文件传输到background,触发上传接口传输到服务器端,完成文件上传操作。
在这里插入图片描述

代码示例

使用到的js工具有,jquery、axios。

popup页面,上传文件页面

<!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>popup</title>
    <style>
        body {
            width: 400px;
            height: 450px;
            background-color: aliceblue;
        }
        .contnet {
            display: flex;
            flex-direction: column;
            flex-wrap: nowrap;
            align-items: center;
        }
        .upload_file {
            display: flex;
            flex-direction: column;
            margin-top: 88px;
        }
        .upload_btn {
            border: none;
            border-radius: 10px;
            background-color: #4343e0;
            font-size: 16px;
            color: white;
            font-weight: 400;
            font-family: '微软雅黑';
            cursor: pointer;
        }
        .upload_btn:hover {
            border: none;
            border-radius: 10px;
            background-color: #4343e0;
            font-size: 16px;
            color: white;
            font-weight: 400;
            font-family: '微软雅黑';
            cursor: pointer;
            box-shadow: 0px 0px 0px 1px #848181;
        }
    </style>
</head>
<body>
    <div class="contnet">
        <div class="upload_file">
            <!--  
              type: input类型为文件选择类型
          		name: 参数名
              accept: 上传文件的可选类型
          	-->
            <input id="uploadFile" type="file" name="myFile" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet|application/vnd.ms-excel" style="margin-bottom: 5px;" />
            <button id="uploadFileBtn" class="upload_btn" type="button">上传</button>
        </div>
    </div>
</body>
<script type="text/javascript" src="/utils/chrome.js"></script>
<script type="text/javascript" src="/lib/jquery-3.6.3.js"></script>
<script type="text/javascript" src="/popup/popup.js"></script>

</html>

popup页面,js上传代码,file文件转base64

// popop.js、jquery-3.6.3.js
// 绑定文件上传的button
$("#uploadFileBtn").click(() => {
    // 如果是单文件上传,选择第一个文件上传
    //let file = $("#uploadFile")[0].files[0] // ok
    let file = $("#uploadFile").prop('files')[0]
    if (!file) {
        alert('文件上传:' + '请先选择文件')
        return
    }
    let boo = confirm('是否确认上传文件?\n\r 请谨慎操作上传文件')
    if (boo) {
        // file转base64
        let reader = new FileReader()
        reader.readAsDataURL(file)
        reader.onload = () => {
            let base64 = reader.result.split(',')[1]
            // 发送base64到background
            // chrome.js
            sendMessageToBackground({type: 'upload', base64: base64}, (rsp) => {
                // 上传成功 or 失败后做一些操作
            })
        }
    }
})

background监听消息,base64转file文件,axios上传

// 上传文件
// axios.js
// base64: popup传过来的数据
function uploadFile(base64) {
    // base64转blob
    let blob = base64ToBlob(base64, 'application/vnd.ms-excel')
    // blob转file
  	let file = new File([blob], '上传文件的名字[filename].xlsx', {type: 'application/vnd.ms-excel'})

    // 构造formData表单对象,发起post请求
    let formatData = new FormData()
    formatData.append('file', file)
  
  	// axios发送文件上传的请求
    return axios({
        url: 'upload_url',
        method: 'POST',
        headers: {
            'xx-header': 'xxx',
            // 'Content-Type': 'multipart/form-data' // 不需要设置Content-Type请求头,axios请求机制会自动判断,发起什么样的请求
        },
        transformRequest: [(data, headers) => {
            delete headers['Content-Type']
            return data
        }],
        data: formatData
    }).then(rsp => {
        // 服务器数据响应
        return rsp.data
    })
}

/**
 *	
 * @param {*} mineType 选择适当的类型来转换base64,并创建Blob二进制对象
 *  'application/pdf': 表示 PDF 文件类型,可以以可移植文档格式查看和编辑。
 *  'application/msword' 或 'application/vnd.ms-word': 表示 Word 文档类型,可以以 Microsoft Word 格式查看和编辑。
 *  'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 表示 Word 2007 或更高版本的文件类型,可以以 Office Open XML 格式查看和编辑。
 *  'application/epub+zip': 表示 ePub 电子书类型,可以以电子书格式查看和编辑。
 *  'application/vnd.ms-powerpoint' 或 'application/mspowerpoint': 表示 PowerPoint 演示文稿类型,可以以 Microsoft PowerPoint 格式查看和编辑。
 *  'application/vnd.openxmlformats-officedocument.presentationml.presentation': 表示 PowerPoint 2007 或更高版本的文件类型,可以以 Office Open XML 格式查看和编辑。
 *  'application/vnd.ms-excel' 或 'application/msexcel': 表示 Excel 电子表格类型,可以以 Microsoft Excel 格式查看和编辑。
 *  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 表示 Excel 2007 或更高版本的文件类型,可以以 Office Open XML 格式查看和编辑。
 *  'image/jpeg'、'image/png'、'image/gif' 等:表示图像类型的数据,可以以图像的形式查看和编辑。
 * @returns 
 */
function base64ToBlob(base64, mineType) {
    mineType = mineType || 'application/octet-stream'
    const byteCharacters = atob(base64)
    const byteNumbers = new Array(byteCharacters.length)
    for(let i = 0; i < byteCharacters.length; i++) {
        byteNumbers[i] = byteCharacters.charCodeAt(i)
    }
    let byteArray = new Uint8Array(byteNumbers)
    return new Blob([byteArray], {type: mineType})
}

附-转base64后直接下载

function download(base64, mineType) {
  mineType = mineType || 'application/octet-stream'
  const dataUrl = `data:${mineType};base64,${base64}`

  const link = document.createElement('a')
  // document.body.appendChild(link)
  link.href = dataUrl
  link.download = 'file.xlsx' // 前提需要先知道是什么文件类型
  link.click() // 点击下载
  // document.body.removeChild(link) // 下载完成后移除标签
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/824572.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下安装配置Redis

文章目录 安装依赖库上传安装包并解压 启动默认启动指定配置启动开机自启 安装 依赖库 Redis是基于C语言编写的&#xff0c;因此首先需要安装Redis所需要的gcc依赖&#xff1a; yum install -y gcc tcl上传安装包并解压 将Redis安装包上传到服务器的任意目录&#xff0c;例…

使用WebMvcConfigurationSupport后导致原来返回的json数据变为了xml的解决方法

问题 未使用WebMvcConfigurationSupport拦截时返回的数据都是JSON格式&#xff0c;使用WebMvcConfigurationSupport做拦截后数据的返回变为了XML的格式。 原因 在Spring框架中&#xff0c;WebMvcConfigurationSupport 是一个类&#xff0c;它可以用于自定义Spring MVC的配置…

【word密码】如何解密word密码?

Word文档常见的两种加密方式&#xff0c;打开密码和限制编辑&#xff0c;这两种密码对word文档加密&#xff0c;今天我们来讲一下这三种加密如何解密 解密一&#xff1a;打开密码 设置了打开密码的word文件&#xff0c;想要解密&#xff0c;我们需要先输入密码进入到文件当中…

IO进程线程第四天(8.1)opendir,closedir,readdir

作业1&#xff1a; 从终端获取一个文件的路径以及名字。 若该文件是目录文件&#xff0c;则将该文件下的所有文件的属性显示到终端&#xff0c;类似ls -l该文件夹 若该文件不是目录文件&#xff0c;则显示该文件的属性到终端上&#xff0c;类似ls -l这单个文件 #include<…

华为OD机试真题 JavaScript 实现【箱子之形摆放】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、JavaScript算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例…

【Uniapp 中实现微信登录】

要在 Uniapp 中实现微信登录&#xff0c;需要完成以下步骤&#xff1a; 在微信开放平台注册一个应用&#xff0c;并获取到该应用的 AppID 和 AppSecret。 在 manifest.json 中点击App模块配置。勾选微信登录模块&#xff0c;填入该应用的 AppID 在代码中调用 uni.login 方法&…

学习记录——EGE-UNet、CFNet

EGE-UNet: an Efficient Group Enhanced UNet for skin lesion segmentation 上海交大 2023 MICCAI 基于 U-Net 进行魔改&#xff0c;用于解决医学图像&#xff08;尤其是皮肤病变&#xff09;分割中面临的问题。由于它是针对移动健康应用开发的&#xff0c;解决了当前许多模型…

docker下载镜像慢

下载镜像的方法 手动下载&#xff0c;然后再打开 此方法有局限&#xff0c;因为不是所有的镜像地址都支持http访问。 方法是打开此镜像市场网站&#xff0c;搜索自己想要的镜像&#xff0c;然后点击下载即可。 Linux一般是下载一个压缩包&#xff0c;解压之后docker load就可…

用于医学图像分类的双引导的扩散网络

文章目录 DiffMIC: Dual-Guidance Diffusion Network for Medical Image Classification摘要本文方法实验结果 DiffMIC: Dual-Guidance Diffusion Network for Medical Image Classification 摘要 近年来&#xff0c;扩散概率模型在生成图像建模中表现出了显著的性能&#xf…

【update】自动更新设计小记

前情纪要 老项目的一个更新迭代实例方式处理&#xff0c;从功能梳理&#xff0c;待流程设计,…了解功能&#xff0c;时序图&#xff0c;流程图记录 关系图梳理 流程图设计

ChatGPT及其工作原理;OpenAI申请注册商标GPT-5,引发关注

&#x1f989; AI新闻 &#x1f680; OpenAI申请注册商标GPT-5&#xff0c;引发关注 摘要&#xff1a;OpenAI已在上月18日申请注册商标GPT-5&#xff0c;显示该模型将提供文本生成、自然语言理解、语音转录、翻译、分析等功能。此前OpenAI曾表示尚未开始训练GPT-4的后继者GPT…

Java培训去哪?Java培训普遍花费贵吗?

随着Java开发语言1995年诞生到如今&#xff0c;跨越了20个春夏秋冬&#xff0c;是时下最热的开发语言之一&#xff0c;想要接触了解的人群越来越多。对绝大多数准备学习java这门的学员来讲&#xff0c;Java培训去哪是一个绕不开的问题。接下里笔者就和大家一起探讨一下。 普遍来…

解决有道云笔记自动更新问题 关闭有道云笔记自动更新 有道云笔记自动升级v7.2.8

解决有道云笔记自动更新问题 关闭有道云笔记自动更新 有道云笔记自动升级v7.2.8 一、背景 最近使用有道云笔记时&#xff0c;遇到bug问题&#xff1a; 打不开加密的笔记&#xff0c;发现是最新版本v7.2.8&#xff0c;切换到v7.2.7后&#xff0c;一切恢复正常。 在使用有道云笔…

质量指标如何发挥作用?构建质量能力是关键

本文首发于个人网站「BY林子」&#xff0c;转载请参考版权声明。 各个团队的质量管理不够规范&#xff0c;想要一套质量指标对其进行规范化的考核。 指标&#xff0c;总是受到管理者们的青睐&#xff0c;甚至有人绞尽脑汁研究出各种指标的计算方式&#xff0c;似乎利用指标来进…

windows创建不同大小的文件命令

打开命令窗口&#xff08;windowsR输入cmd打开&#xff09; 输入&#xff1a;fsutil file createnew C:\Users\Desktop\fileTran\10M.txt 10240000&#xff0c;创建10M大小的文件。 文件若存在需要先删除。

基于jsp的企业员工信息管理系统的设计与实现--【毕业论文】

文章目录 本系列校训毕设的技术铺垫文章主体层次摘要示例摘要的写法英文摘要&#xff1a; 选题目的和意义&#xff1a;与本课题相关的技术和方法综述&#xff1a;系统分析经济上的可行性技术上的可行性开发结构分析系统功能需求系统模型 系统概要设计&#xff1a;数据库设计系统…

python 异步Web框架sanic

我们继续学习Python异步编程&#xff0c;这里将介绍异步Web框架sanic&#xff0c;为什么不是tornado&#xff1f;从框架的易用性来说&#xff0c;Flask要远远比tornado简单&#xff0c;可惜flask不支持异步&#xff0c;而sanic就是类似Flask语法的异步框架。 github&#xff1…

Java并发----进程、线程、并行、并发

一、进程与线程 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 CPU&#xff0c;数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的 当一个程序被运行…

车载GPS模块有哪些部分构成?_GPS北斗模块定位原理

GPS模块硬件的常规性硬件有&#xff1a;主板或者电路板、芯片、天线等&#xff0c;这些都是必备的硬件。我们常说的GPS定位模块称为用户部分&#xff0c;它像“收音机”一样接收、解调卫星的广播C/A码信号&#xff0c;中以频率为1575.42MHz。 芯片是GPS模块里面的很重要的一部分…

IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介

系列文章目录 IDEA上面书写wordcount的Scala文件具体操作 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍 目录 系列文章目录 前言 一 准备工作 1.1 安装Maven 1.1.1 Maven安装配置步骤 1.1.2 解压相关的软件包 1.1.3 Maven 配置环境变量 1.1.4 配…