{"id":19974418,"url":"https://github.com/alanchenchen/browserbuffer","last_synced_at":"2025-05-04T02:32:41.902Z","repository":{"id":34881543,"uuid":"185569758","full_name":"alanchenchen/browserBuffer","owner":"alanchenchen","description":"A simple implementation for browser to switch string between buffer","archived":false,"fork":false,"pushed_at":"2022-12-04T13:46:50.000Z","size":1124,"stargazers_count":12,"open_issues_count":9,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-04-29T05:04:34.573Z","etag":null,"topics":["arraybuffer","browser","browserbuffer","buffer","download","download-file","readfile","upload-file"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/alanchenchen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-05-08T08:59:29.000Z","updated_at":"2024-01-10T09:18:17.000Z","dependencies_parsed_at":"2023-01-15T09:52:36.125Z","dependency_job_id":null,"html_url":"https://github.com/alanchenchen/browserBuffer","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alanchenchen%2FbrowserBuffer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alanchenchen%2FbrowserBuffer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alanchenchen%2FbrowserBuffer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/alanchenchen%2FbrowserBuffer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/alanchenchen","download_url":"https://codeload.github.com/alanchenchen/browserBuffer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252279073,"owners_count":21722833,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["arraybuffer","browser","browserbuffer","buffer","download","download-file","readfile","upload-file"],"created_at":"2024-11-13T03:14:57.881Z","updated_at":"2025-05-04T02:32:41.372Z","avatar_url":"https://github.com/alanchenchen.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# browserBuffer\n\n[![Build Status](https://travis-ci.com/alanchenchen/browserBuffer.svg?branch=master)](https://travis-ci.com/alanchenchen/browserBuffer)\n![](https://img.shields.io/npm/v/@alanchenchen/browserbuffer.svg)\n![](https://img.shields.io/npm/dt/@alanchenchen/browserbuffer.svg)\n[![LICENSE](https://img.shields.io/badge/license-Anti%20996-blue.svg)](https://github.com/996icu/996.ICU/blob/master/LICENSE)\n\nA simple implementation for browser to switch string between buffer\n\u003e Author：Alan Chen\n\n\u003e Version: 0.1.2\n\n\u003e Date: 2019/09/27\n\n\u003e 浏览器端js在字符串和ArrayBuffer之间转换的插件\n\n## Feature\n* 模仿nodejs的两个api，from表示转换字符串到ArrayBuffer，toString表示转换ArrayBuffer到指定编码格式的字符串。\n* 完全基于浏览器端的api，不支持nodejs。\n* 自带浏览器端下载文件的功能，模拟nodejs的fs模块的writeFile。\n* 封装浏览器端上传文件功能，模拟nodejs的fs模块的readFile，不需要手写input标签，局限性更低，可以通过任何方式来触发系统dialog。\n* 由于ArrayBuffer、Blob以及FileReadr的使用，所以目前PC端只兼容IE10+，移动端浏览器未测试。\n\n## Installation\n* `npm install @alanchenchen/browserbuffer --save` or `yarn add @alanchenchen/browserbuffer`\n\n## Usage\n### Constructor\n* 构造器无参数，必须使用new操作符生成一个实例。\n\n### Instance Methods\n1. from `[function(String | Blob | ArrayBuffer) ArrayBuffer, String]`，将一个字符串(或Blob对象、或ArrayBuffer)转成一个ArrayBuffer，2个参数，参数而可选utf8和base64。返回一个Promise, reslove一个ArrayBuffer\n2. toString `[function(Blob | ArrayBuffer, Object) String]`，将一个Blob对象、或ArrayBuffer转成一个utf8、base64或dataURL三种格式之一的字符串，两个参数。返回一个Promise，reslove一个String。第二个参数为一个可选对象，如下：\n    * encode `[String]`，可选，转换后的字符串编码格式，有utf8、base64和dataURL三种可选，默认为utf8\n    * MIME `[String]`，可选，仅当编码格式为dataURL生效，决定转换后数据的文件类型，默认为text/plain，txt文本\n    * charset `[String]`，可选，仅当编码格式为dataURL生效，决定转换后数据的编码类型，默认为utf8编码\n3. readFile `[function(Object)]`，通过打开系统dialog读取本地文件数据，返回一个Promise，reslove文件数据，一个参数，参数是一个对象，如下：\n    * accept `[Array]`，可选，允许用户上传任何类型的文件，但不能完全限制，数组项可以是MIME信息，也可以是文件后缀名，还可以是`image/*`这种，默认允许所有类型\n    * multiple `[Boolean]`，是否支持多选，默认为false不支持，如果支持，可以通过键盘Shift或Control来多选\n    * encode `[String]`，文件的编码格式，utf8、base64和binary字符串其中之一，默认为base64\n4. writeFile `[function(Object)]`，写入数据到本地文件，返回一个Promise，一个参数，参数是一个对象，如下：\n    * filename `[String]`，可选，文件名，可以带后缀名，如果带后缀名，则以后缀名为主，不带则取MIME信息。若为空，则默认为浏览器命名文件，chrome会命名为'下载'\n    * dataPath `[String]`，当data为空时必选，同源的文件url路径，如果不为空，则只会下载此同源服务器路径的文件，而忽略data\n    * data `[String | Object | Blob | ArrayBuffer]`，当dataPath为空时必选，写入的数据\n    * MIME `[String]`，可选，仅当filename不带后缀名时生效，决定转换后数据的文件类型，默认为text/plain，txt文本。filename如果带上后缀名，则会覆盖MIME\n    * charset `[String]`，可选，文件的编码格式，默认为utf8\n## Example\n* [buffer转换例子](./example/bufferAndString.js)\n* [读取文件例子](./example/uploadFile.js)\n* [下载文件例子](./example/download.js) 将base64字符串下载到图片需要先转成arraybuffer！\n\n## Attention\n1. 由于string和ArrayBuffer之间的转换依赖于FileReader，所以导致form和toString方法只能返回一个Promise，可以搭配Async函数来获取返回值。\n2. 因为FileReader的存在，让浏览器端js操作buffer转码越来越方便，所以我并没有手动通过unicde值来实现(我实现了一个插件不借助FileReader来转换)。\n3. 通过插件转换后的ArrayBuffer均遵循utf8编码规范，所以ASCII字符(英文字母、数字和一些符号)都只占1个字节，汉字占3个字节，这和nodejs里的buffer实现完全一致。所以前端可以直接把ArrayBuffer通过流的形式传给后台，解析起来很容易。但是需要区分的是js本身存储字符串是遵循的utf16规范。\n4. 插件借助FileReader只能操作buffer转码，如果需要操作buffer内存空间数据，则只能通过TypedArray或者DataView实现，nodejs里则完全可以通过buffer模块实现，这一点区别需要注意。\n5. toString方法虽然也可以传入字符串，但是只建议arryabuffer，而且wirteFile方法的data虽然支持字符串，但是base64字符串不会转换成二进制数据写入文件，所以如果需要将base64的数据写入非文本，则需要先from，然后再writeFile。\n6. 读取文件由于浏览器安全考虑，所以只能通过用户手动上传，所以无法直接跟nodejs的readFile一致。读取文件方法因为不需要传入input标签，所以你可以在任何时候触发，你可以手动实现各种各样的上传功能。\n\n## license\n* Anti 996(996.ICU)\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falanchenchen%2Fbrowserbuffer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falanchenchen%2Fbrowserbuffer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falanchenchen%2Fbrowserbuffer/lists"}