Chrome扩展:本地应用上传本地文件到谷歌插件,再由插件上传到服务器

须知

谷歌扩展只能传输和JSON兼容的数据,可通过JSON.parse(JSON.stringify(form_data))判断兼容与否。
在这里插入图片描述

解决方案

FormData和JSON不兼容。要上传文件,可通过发送方将File对象转换为dataURL,接收方解析回File对象,再生成FormData对象上传文件。本地应用和插件通信是通过Chrome.runtime.sendMessage和Chrome.runtime.onMessageExternal。详细过程如下:
在这里插入图片描述

代码

发送方:本地应用

let fileReader = new FileReader();
  
fileReader.onload = function(evt) {
  const dataURL = evt.target.result;
  // 本地应用发送数据
  chrome.runtime.sendMessage(extId, {
    method: 'POST', // 这里由于插件,我用的是fetch。ajax用type
    dataURL,
    url,
    headers
  }, (res) => {
    if (res.status === 0) {
      resolve(res);
    } else {
      reject(res);
    }
  });
}
// 将本地获取的file对象转换为dataURL
fileReader.readAsDataURL(file);

接收方:谷歌插件

chrome.runtime.onMessageExternal.addListener((message, sender, sendResponse) => {
  const { dataURL, url, ...rest } = message,
  blob = dataURLtoBlob(dataURL),
  img = blobToFile(blob, 'img'),
  formData = new FormData();
  formData.append('upload', img);
  rest.body = formData;  // fetch格式
  
  // 上传给服务器
  fetch(url, rest)
  .then(res => res.json()) // fetch需要使用res.json()才能获取到数据
  .then((res) => {
    if (res.message === 'success') {
      sendResponse({ status: 0, res });
    } else {
      sendResponse({ status: -1, res });
    }
  });
}

接收方:格式转换代码

// dataURL转换为Blob
const dataURLtoBlob = (dataUrl) => {
  let 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 Blob([u8arr], {
    type: mime
  })
}
// Blob转换为File
const blobToFile = (blob, fileName) => {
  return new File([blob], fileName);
}

其他方案:
SharedWorker

相关文章:
File对象、dataURL、Blob对象互转
Message Passing - Google Chrome
chrome.runtime.onMessageExternal - Google Chrome
javascript - Does chrome.runtime support posting messages with transferable objects? - Stack Overflow
shared-workers-and-the-sharedworker-interface

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Wappalyzer是一款用于Chrome和Firefox浏览器的插件,用于识别访问的网站使用的技术栈和服务。这个插件可以帮助用户快速了解一个网站所使用的技术,包括Web服务器、内容管理系统、前端库、编程语言、分析工具等等。 Wappalyzer插件使用简单方便,只需要用户在浏览器中安装插件后,访问一个网站,插件会自动扫描网站的源代码,通过对比和匹配,识别出网站所使用的技术和服务,并在浏览器的工具栏显示出来。 通过Wappalyzer,用户可以快速了解一个网站的技术栈,当用户对某个网站感兴趣或有特定需求时,可以通过插件提供的信息更好地了解网站所用的技术,从而对网站进行评估和分析。 Wappalyzer可以为开发者提供很多便利,它可以帮助开发者了解竞争对手的技术栈,从中借鉴和学习优秀的技术实践;它还可以帮助开发者更好地评估和选择适合自己项目需求的技术和服务。 总而言之,Wappalyzer是一款非常实用的浏览器插件,它能够帮助用户在浏览网站的过程中更好地了解网站所使用的技术和服务,对用户和开发者都有很大的帮助。 ### 回答2: Wappalyzer 是一款非常有用的 Google 浏览器插件。它可以帮助用户在浏览网页时快速获取目标网站的技术栈信息。该插件通过识别网页中使用的不同技术,如网站编程语言、网页服务器、内容管理系统、分析工具等,为用户提供详细的网站技术分析报告。 Wappalyzer 具有如下的特点和优势: 1. 轻量级:该插件占用的系统资源相对较小,不会影响浏览器的性能。 2. 界面友好:它提供了直观易懂的用户界面,用户可以轻松获得所需的技术信息。 3. 快速识别:Wappalyzer 可以在加载网页的同时快速识别网站使用的技术,无需用户手动操作。 4. 准确性高:该插件的技术识别准确度相对较高,能够准确识别出许多常见的网站技术。 5. 多语言支持:Wappalyzer 可以识别并显示网站使用的不同编程语言,如PHP、Python、JavaScript等,满足不同用户的需求。 6. 支持扩展:用户可以根据自己的需要选择性地安装扩展来增强 Wappalyzer 的功能。 Wappalyzer 对于开发者、安全研究员和普通用户来说,都是一个非常有用的浏览器辅助插件。开发者可以通过该插件了解其他网站的技术选型,从中学习和借鉴;安全研究员可以通过分析目标网站的技术信息,找到潜在的安全漏洞;普通用户可以通过了解网站的技术选型,更好地判断网站的可信度和安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值