惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Proofpoint News Feed
博客园_首页
爱范儿
爱范儿
博客园 - 三生石上(FineUI控件)
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
IT之家
IT之家
人人都是产品经理
人人都是产品经理
T
Troy Hunt's Blog
H
Hacker News: Front Page
N
News and Events Feed by Topic
N
News | PayPal Newsroom
www.infosecurity-magazine.com
www.infosecurity-magazine.com
PCI Perspectives
PCI Perspectives
有赞技术团队
有赞技术团队
Google Online Security Blog
Google Online Security Blog
博客园 - 【当耐特】
Schneier on Security
Schneier on Security
S
SegmentFault 最新的问题
博客园 - Franky
T
The Blog of Author Tim Ferriss
罗磊的独立博客
T
The Exploit Database - CXSecurity.com
I
Intezer
Microsoft Security Blog
Microsoft Security Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog
L
Lohrmann on Cybersecurity
T
Threat Research - Cisco Blogs
U
Unit 42
Forbes - Security
Forbes - Security
MyScale Blog
MyScale Blog
J
Java Code Geeks
S
Secure Thoughts
G
Google Developers Blog
SecWiki News
SecWiki News
T
Tailwind CSS Blog
T
Tor Project blog
P
Proofpoint News Feed
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Hacker News: Ask HN
Hacker News: Ask HN
P
Privacy International News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
美团技术团队
T
Threatpost
小众软件
小众软件
W
WeLiveSecurity

博客园 - HorseShoe2016

Ethereum 学习笔记 ---- Solidity 数据位置(Calldata, Memory, Storage)编码与布局全解析 vscode 禁用警告提示音 浏览器加载 HTML 页面并执行 Javascript 的流程图 Ethereum学习笔记 ---- 多重继承中的 C3线性化算法 Ethereum学习笔记 ---- 使用 Remix 调试功能理解 bytes 在 memory 中的布局 Ethereum学习笔记 ---- 通过 Event 学习《合约ABI规范》 vscode 无法调试 golang testify suite 中的单个 test 的解决办法 纯js实现 vue 组件 与 vue 单文件组件对比 一个简单的 indexedDB 应用示例 html 元素的 onEvent 与 addEventListener vue3 defineComponent: 使用纯 Javascript 定义组件 vue3 动态编译组件失败:Component provided template option but runtime compilation is not supported in this build of Vue Javascript Object 中,isExtensible/isSealed/isFrozen 的对比 mini-vue: 响应式数据的实现 手写Promise vscode vue 插件与 emmet、tailwind css 插件冲突的解决方案 Python 安装依赖包,出现 ssl.SSLCertVerificationError 的问题,解决方法 CentOS7 源码编译安装 Python 3.8.10,开启 SSL 功能 Protocol Buffer Go (proto3) - macos 搭建 protocol buffer 环境 + Encoding 实验
Javascript: Blob, File/FileReader, ArrayBuffer, ReadableStream, Response 转换方法
HorseShoe2016 · 2024-07-17 · via 博客园 - HorseShoe2016

先上图

各个 Object

ArrayBuffer:

1. ArrayBuffer 是 JavaScript 中的一种数据类型,用于表示通用的、固定长度的二进制数据缓冲区。

2. ArrayBuffer 对象表示内存中的一段二进制数据,并且不能直接操作这些数据,需要使用 TypedArray 或 DataView 对象来操作。

3. 可以通过 ArrayBuffer 构造函数创建一个指定长度的 ArrayBuffer 对象。

Blob:

1. Blob 表示二进制大对象(Binary Large Object),通常用于表示文件或数据的片段。

2. Blob 对象可以包含任意类型的数据,包括文本数据、图像数据等。

3. 可以使用 Blob 构造函数创建一个新的 Blob 对象,也可以通过 BlobBuilder 或 Blob 的静态方法创建。

File:

1. File 对象是 Blob 的子类,表示文件的一种特殊类型。

2. File 对象通常用于表示用户通过文件选择器选择的文件。

3. File 对象包含文件的元数据,如文件名、大小、类型等。

FileReader:

1. FileReader 对象唯一目的是读取文件或 Blob 对象中的数据,并将其转换为String或 ArrayBuffer。

2. FileReader 提供了异步读取文件的接口,可以监听 load 事件来处理读取完成后的数据。

3. 通过调用 FileReader 对象的 readAsText() 方法可以将文件或 Blob 中的数据读取为字符串,而调用 readAsArrayBuffer() 方法则可以将数据读取为 ArrayBuffer。

ReadableStream:

1. ReadableStream 是 JavaScript 中的流对象,用于表示可读取的数据流。

2. ReadableStream 对象提供了一种从数据源(如网络请求、文件等)读取数据的方式,可以逐个读取数据并进行处理。

3. ReadableStream 对象通常用于处理大型数据流,如网络请求响应、文件读取等。

综上所述,ArrayBuffer、Blob、File、FileReader 和 ReadableStream 是 JavaScript 中用于处理二进制数据和文件的重要对象和接口。它们可以配合使用,实现对文件和数据的读取、处理和传输。

Response

Response 对象是浏览器 Fetch API 提供的一种接口,用于表示 HTTP 响应。它包含了响应的各种信息,如响应状态码、响应头部、响应体等,以及一些用于处理响应数据的方法。

以下是 Response 对象的一些常用属性和方法:

  1. status: 表示 HTTP 响应的状态码。

  2. statusText: 表示 HTTP 响应状态码的文本描述。

  3. headers: 表示响应头部信息的 Headers 对象。

  4. ok: 表示响应是否成功,即状态码是否在 200 到 299 之间。

  5. url: 表示响应的 URL。

  6. body: 表示响应的主体部分,可以是 ReadableStream、Blob、FormData、BufferSource 等类型。

  7. text(): 以文本形式读取响应的主体部分。

  8. json(): 以 JSON 格式解析响应的主体部分。

  9. blob(): 以 Blob 对象形式读取响应的主体部分。

  10. arrayBuffer(): 以 ArrayBuffer 对象形式读取响应的主体部分。

用法举例

ArrayBuffer

// 创建一个长度为 8 字节的 ArrayBuffer
const buffer = new ArrayBuffer(8);

// 使用 Int32Array 视图操作 ArrayBuffer 中的数据
const intArray = new Int32Array(buffer);
intArray[0] = 123;
console.log(intArray); // 输出: Int32Array(2) [ 123, 0 ]

Blob, File, FileReader

  • FileReader 读取 Blob
// 创建一个包含文本内容的 Blob 对象
const blob = new Blob(['Hello, world!'], { type: 'text/plain' });

// 创建一个 FileReader 对象
const reader = new FileReader();

// 监听 FileReader 对象的 load 事件
reader.onload = function(event) {
  // 读取完成后,event.target.result 中存储了转换后的字符串
  const resultString = event.target.result;
  console.log(resultString); // 输出: Hello, world!
};

// 将 Blob 对象中的数据读取为字符串
reader.readAsText(blob);
  • FileReader 读取 File 对象
<input type="file" id="fileInput">
<script>
  document.getElementById('fileInput').addEventListener('change', function(event) {
    const file = event.target.files[0]; // 获取用户选择的文件
    console.log(file.name); // 输出文件名

    const reader = new FileReader();
    reader.onload = function(event) {
      const resultString = event.target.result;
      console.log(resultString); // 输出文件内容
    };
    reader.readAsText(file); // 读取文件内容为字符串
  });
</script>

ReadableStream

  • 示例1
async function main() {
  // 创建一个 ReadableStream 对象,用于从指定 URL 中读取数据
  const promise = fetch('https://www.baidu.com')

  const response = await promise

  const bodyStream = response.body

  // 创建一个 StreamReader 对象,用于读取数据流
  const reader = bodyStream.getReader()

  const arrayArray = []

  while (true) {
    // 读取数据流的一部分并处理
    const { done, value } = await reader.read()
    if (done) {
      console.log('读取完成, 输出结果:')
      const str = await uint8ArrayToString(arrayArray)
      console.log(str.slice(0, 300))
      break
    }
    console.log('读取到新数据, length:', value.length)
    arrayArray.push(value)
  }
}

async function uint8ArrayToString(arrayArray) {
  const blob = new Blob(arrayArray, { type: 'text/plain' })
  const text = await blob.text()
  return text
}

main()
  • 示例2
fetch('https://www.example.org/').then((response) => {
  const reader = response.body.getReader()
  const stream = new ReadableStream({
    start(controller) {
      // The following function handles each data chunk
      function push() {
        // "done" is a Boolean and value a "Uint8Array"
        return reader.read().then(({ done, value }) => {
          // Is there no more data to read?
          if (done) {
            // Tell the browser that we have finished sending data
            controller.close()
            return
          }

          // Get the data and send it to the browser via the controller
          controller.enqueue(value)
          push()
        })
      }

      push()
    },
  })

  return new Response(stream, { headers: { 'Content-Type': 'text/html' } })
})

关于 ReadableStream 的一点总结

fetch() 返回的是一个 Promise, 该 Promise resolve 的结果是 Response 对象

Response.body 是一个 ReadableStream

ReadableStream.getReader 返回 ReadableStreamDefaultReader or ReadableStreamBYOBReader

reader.read() 返回一个 Promise, 该 Promise resolve 的数据是一个Object { done, value }

reader 可以如下使用:

function run() {
  reader.read().then(({ done, value }) => {
    if (done) {
      // 没有更多数据了
      finished = true
      return
    }
    // deal with value
    //...
    run()
  })
}
run()

Response

构造函数

new Response()
new Response(body)
new Response(body, options)

Parameters

body Optional

An object defining a body for the response. This can be null (which is the default value), or one of:

options Optional

An options object containing any custom settings that you want to apply to the response, or an empty object (which is the default value). The possible options are:

status

The status code for the response. The default value is 200.

statusText

The status message associated with the status code, such as "OK". The default value is "".

headers

Any headers you want to add to your response, contained within a Headers object or object literal of String key/value pairs (see HTTP headers for a reference). By default this is empty.

blob()

const myImage = document.querySelector("img");

const myRequest = new Request("flowers.jpg");

fetch(myRequest)
  .then((response) => response.blob())
  .then((myBlob) => { // response.blob() 返回的是 Promise,这里的 then() 接收到的 myBlob 是
                      // Promise resolve 后的 blob
    const objectURL = URL.createObjectURL(myBlob);
    myImage.src = objectURL;
  });

posted on 2024-07-17 17:09  HorseShoe2016  阅读(842)  评论()    收藏  举报