Skip to content

Commit eabd232

Browse files
committed
[F] fix bug about base64 transform to arraybuffer
1 parent a69bcb4 commit eabd232

File tree

10 files changed

+4799
-31
lines changed

10 files changed

+4799
-31
lines changed

.npmignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
config/
2-
yarn.lock
2+
yarn.lock
3+
example/

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
A simple implementation for browser to switch string between buffer
99
> Author:Alan Chen
1010
11-
> Version: 0.1.1
11+
> Version: 0.1.2
1212
13-
> Date: 2019/06/05
13+
> Date: 2019/09/27
1414
1515
> 浏览器端js在字符串和ArrayBuffer之间转换的插件
1616
@@ -29,8 +29,8 @@ A simple implementation for browser to switch string between buffer
2929
* 构造器无参数,必须使用new操作符生成一个实例。
3030

3131
### Instance Methods
32-
1. from `[function(String | Blob | ArrayBuffer) ArrayBuffer]`,将一个字符串(或Blob对象、或ArrayBuffer)转成一个ArrayBuffer,一个参数。返回一个Promise, reslove一个ArrayBuffer
33-
2. toString `[function(String | Blob | ArrayBuffer, Object) String]`将一个字符串(或Blob对象、或ArrayBuffer)转成一个utf8、base64或dataURL三种格式之一的字符串,两个参数。返回一个Promise,reslove一个String。第二个参数为一个可选对象,如下:
32+
1. from `[function(String | Blob | ArrayBuffer) ArrayBuffer, String]`,将一个字符串(或Blob对象、或ArrayBuffer)转成一个ArrayBuffer,2个参数,参数而可选utf8和base64。返回一个Promise, reslove一个ArrayBuffer
33+
2. toString `[function(Blob | ArrayBuffer, Object) String]`将一个Blob对象、或ArrayBuffer转成一个utf8、base64或dataURL三种格式之一的字符串,两个参数。返回一个Promise,reslove一个String。第二个参数为一个可选对象,如下:
3434
* encode `[String]`,可选,转换后的字符串编码格式,有utf8、base64和dataURL三种可选,默认为utf8
3535
* MIME `[String]`,可选,仅当编码格式为dataURL生效,决定转换后数据的文件类型,默认为text/plain,txt文本
3636
* charset `[String]`,可选,仅当编码格式为dataURL生效,决定转换后数据的编码类型,默认为utf8编码
@@ -47,14 +47,14 @@ A simple implementation for browser to switch string between buffer
4747
## Example
4848
* [buffer转换例子](./example/bufferAndString.js)
4949
* [读取文件例子](./example/uploadFile.js)
50-
* [下载文件例子](./example/download.js)
50+
* [下载文件例子](./example/download.js) 将base64字符串下载到图片需要先转成arraybuffer!
5151

5252
## Attention
5353
1. 由于string和ArrayBuffer之间的转换依赖于FileReader,所以导致form和toString方法只能返回一个Promise,可以搭配Async函数来获取返回值。
5454
2. 因为FileReader的存在,让浏览器端js操作buffer转码越来越方便,所以我并没有手动通过unicde值来实现(我实现了一个插件不借助FileReader来转换)。
5555
3. 通过插件转换后的ArrayBuffer均遵循utf8编码规范,所以ASCII字符(英文字母、数字和一些符号)都只占1个字节,汉字占3个字节,这和nodejs里的buffer实现完全一致。所以前端可以直接把ArrayBuffer通过流的形式传给后台,解析起来很容易。但是需要区分的是js本身存储字符串是遵循的utf16规范。
5656
4. 插件借助FileReader只能操作buffer转码,如果需要操作buffer内存空间数据,则只能通过TypedArray或者DataView实现,nodejs里则完全可以通过buffer模块实现,这一点区别需要注意。
57-
5. 插件实例的所有方法均会返回Promise,所以都建议使用async函数
57+
5. toString方法虽然也可以传入字符串,但是只建议arryabuffer,而且wirteFile方法的data虽然支持字符串,但是base64字符串不会转换成二进制数据写入文件,所以如果需要将base64的数据写入非文本,则需要先from,然后再writeFile
5858
6. 读取文件由于浏览器安全考虑,所以只能通过用户手动上传,所以无法直接跟nodejs的readFile一致。读取文件方法因为不需要传入input标签,所以你可以在任何时候触发,你可以手动实现各种各样的上传功能。
5959

6060
## license

config/lib.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
module.exports = {
66
libraryName: '@alanchenchen/browserbuffer', // npm包名,首字母不允许大写,支持驼峰和短杆写法
77
bundleName: 'BrowserBuffer', // 打包后文件名,也是UMD script直接引入挂在windows对象的key名
8-
version: '0.1.1', // 版本号
8+
version: '0.1.2', // 版本号
99
description: 'A simple implementation for browser to switch string between buffer', // 包描述
1010
keywords: ['BrowserBuffer', 'browser', 'buffer', 'download', 'ArrayBuffer', 'upload'], // 关键词
1111
author: 'Alan Chen', // 作者

dist/BrowserBuffer.js

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example/bufferAndString.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@ const browserBuffer = new BrowserBuffer()
33

44
const fn = async () => {
55
/**
6-
* @example 将字符串转成ArrayBuffer
6+
* @example 将utf8字符串转成ArrayBuffer
77
*/
88
const buf = await browserBuffer.from('测试文字2333测试数字=--测试符号')
99

10+
/**
11+
* @example 将base64字符串转成ArrayBuffer
12+
*/
13+
const buf_1 = await browserBuffer.from('Y2hlbjEyMysr', 'base64')
14+
1015
/**
1116
* @example 将ArrayBuffer转成纯文本
1217
*/

example/download.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,25 @@ const BrowserBuffer = require('../src/index')
22
const browserBuffer = new BrowserBuffer()
33

44
/**
5-
* @example 将字符串下载到一个txt文件
5+
* @example 将utf8字符串下载到一个txt文件
66
*/
77
browserBuffer.writeFile({
88
filename: '测试',
99
data: '一段测试文本...'
1010
})
1111

12+
/**
13+
* @example 将base64字符串下载到一个png文件,如果直接给data传base64字符串,下载下来的png图片会有问题,因为相当于只是把字符串写入了图片而不是二进制写入到图片
14+
*/
15+
browserBuffer
16+
.from('Y2hlbjEyMysr', 'base64')
17+
.then(data => {
18+
browserBuffer.writeFile({
19+
filename: '测试.png',
20+
data
21+
})
22+
})
23+
1224
/**
1325
* @example 将对象下载到一个json文件
1426
*/

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@alanchenchen/browserbuffer",
3-
"version": "0.1.1",
3+
"version": "0.1.2",
44
"author": "Alan Chen",
55
"description": "A simple implementation for browser to switch string between buffer",
66
"main": "dist/BrowserBuffer.js",
@@ -50,7 +50,7 @@
5050
"webpack": "^3.8.1"
5151
},
5252
"engines": {
53-
"node": ">= v10.15.3"
53+
"node": ">= v12.8.1"
5454
},
5555
"babel": {
5656
"presets": [

src/index.js

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
* @description 插件的入口模块。webpack的entry
33
*/
44
/**!
5-
* @name ApiModule
5+
* @name BrowserBuffer
66
* @author Alan chen
7-
* @since 2019/05/07
7+
* @since 2019/09/27
88
* @license 996.ICU
99
*/
1010
module.exports = class BrowserBuffer {
@@ -197,20 +197,37 @@
197197
* 将一个字符串(或Blob对象、或ArrayBuffer)转成一个ArrayBuffer
198198
*
199199
* @param {String | Blob | ArrayBuffer} data 需要转换的数据
200+
* @param {String} encode 编码格式,默认是utf8,可选base64,需要区分utf8和base64转换的方式完全不同!
200201
* @returns {Promise} reslove一个ArrayBuffer,catch一个错误对象
201202
*/
202-
from(data) {
203+
from(data, encode="utf8") {
203204
try {
204205
const blobData = new Blob([data])
205206
return new Promise((resolve, reject) => {
206-
const file = new FileReader()
207-
file.readAsArrayBuffer(blobData)
208-
file.onload = () => {
209-
resolve(file.result)
210-
}
211-
file.onerror = () => {
212-
file.abort()
213-
reject('some erros occured')
207+
if (encode === "utf8") {
208+
const file = new FileReader()
209+
file.readAsArrayBuffer(blobData)
210+
file.onload = () => {
211+
resolve(file.result)
212+
}
213+
file.onerror = () => {
214+
file.abort()
215+
reject('some erros occured')
216+
}
217+
} else if (
218+
encode === "base64"
219+
&& typeof data === "string"
220+
) {
221+
const ut8String = atob(data)
222+
let len = ut8String.length
223+
    const byteArr = new Uint8Array(len)
224+
225+
     while(len--) {
226+
        byteArr[len] = ut8String.charCodeAt(len)
227+
     }
228+
    resolve(byteArr)
229+
} else {
230+
throw new Error("encode must be utf8 or base64")
214231
}
215232
})
216233

@@ -220,9 +237,9 @@
220237
}
221238

222239
/**
223-
* 将一个字符串(或Blob对象、或ArrayBuffer)转成一个utf8、base64或dataURL三种格式之一的字符串
240+
* 将一个Blob对象、或ArrayBuffer转成一个utf8、base64或dataURL三种格式之一的字符串
224241
*
225-
* @param {String | Blob | ArrayBuffer} data 需要转换的数据
242+
* @param {Blob | ArrayBuffer} data 需要转换的数据
226243
* @param {Object} opt
227244
* @param {String} opt.encode 转换后的字符串编码格式,有utf8、base64和dataURL三种可选,默认为utf8
228245
* @param {String} opt.MIME 仅当编码格式为dataURL生效,决定转换后数据的文件类型,默认为text/plain,txt文本

test/module.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ const assert = require('assert')
44
* @description mocha的测试用例,此处用的node自带的断言模块assert
55
*/
66
describe('normal module', function() {
7-
it('module version should be 0.1.1', function() {
7+
it('module version should be 0.1.2', function() {
88
const v = require('../package.json').version
9-
assert.equal(v, '0.1.1')
9+
assert.equal(v, '0.1.2')
1010
})
1111
})

0 commit comments

Comments
 (0)