11/**
22 * @description 插件的入口模块。webpack的entry
33 */
4- module . exports = class BrowserBuffer {
4+ /**!
5+ * @name ApiModule
6+ * @author Alan chen
7+ * @since 2019/05/07
8+ * @license 996.ICU
9+ */
10+ module . exports = class BrowserBuffer {
511 constructor ( ) {
612 this . _init ( )
713 this . version = require ( '../package.json' ) . version
@@ -15,6 +21,8 @@ module.exports = class BrowserBuffer {
1521 */
1622 _init ( ) {
1723 this . _downloadElement = document . createElement ( 'a' )
24+ this . _uploadElement = document . createElement ( 'input' )
25+ this . _uploadElement . type = 'file'
1826 }
1927
2028 /**
@@ -70,6 +78,78 @@ module.exports = class BrowserBuffer {
7078 this . _downloadElement . click ( )
7179 }
7280
81+ /**
82+ * 通过打开系统dialog读取本地文件数据
83+ *
84+ * @param {Object } opt
85+ * @param {Array } opt.accept 允许用户上传任何类型的文件,但不能完全限制,数组项可以是MIME信息,也可以是文件后缀名,还可以是image/*这种,默认允许所有类型
86+ * @param {Boolean } opt.multiple 是否支持多选,默认不支持,如果支持,可以通过键盘Shift或Control来多选
87+ * @param {String } opt.encode 文件的编码格式,utf8、base64和binary字符串其中之一,默认为base64
88+ * @returns {Promise } reslove一个数组,数组包含每个文件的数据对象,catch一个错误对象
89+ */
90+ readFile ( {
91+ accept= [ '*' ] ,
92+ multiple= false ,
93+ encode= 'base64'
94+ } = { } ) {
95+ this . _uploadElement . accept = accept . join ( ',' )
96+ this . _uploadElement . multiple = multiple
97+
98+ const readOneFile = ( file , encode = 'base64' ) => {
99+ return new Promise ( ( resolve , reject ) => {
100+ const reader = new FileReader ( )
101+ let fn = null
102+ switch ( encode ) {
103+ case 'utf8' :
104+ fn = 'readAsText'
105+ break
106+ case 'base64' :
107+ fn = 'readAsDataURL'
108+ break
109+ case 'binary' :
110+ fn = 'readAsArrayBuffer'
111+ break
112+ default :
113+ fn = 'readAsDataURL'
114+ }
115+ reader [ fn ] ( file )
116+ reader . onload = ( ) => {
117+ let result = reader . result
118+ if ( encode == 'base64' ) {
119+ result = reader . result . split ( 'base64,' ) [ 1 ]
120+ }
121+ resolve ( result )
122+ }
123+ reader . onerror = ( ) => {
124+ reader . abort ( )
125+ reject ( 'some erros occured' )
126+ }
127+ } )
128+ }
129+
130+ return new Promise ( ( resolve , reject ) => {
131+ this . _uploadElement . onchange = async ( e ) => {
132+ let fileData = [ ]
133+ let fileslist = this . _uploadElement . files || e . path [ 0 ] . files
134+ try {
135+ for ( let key of Object . keys ( fileslist ) ) {
136+ fileData [ key ] = { }
137+ fileData [ key ] . name = fileslist [ key ] . name
138+ fileData [ key ] . type = fileslist [ key ] . type
139+ fileData [ key ] . size = fileslist [ key ] . size
140+ fileData [ key ] . lastModified = fileslist [ key ] . lastModified
141+ fileData [ key ] . lastModifiedDate = fileslist [ key ] . lastModifiedDate
142+ fileData [ key ] . data = await readOneFile ( fileslist [ key ] , encode )
143+ }
144+ resolve ( fileData )
145+ } catch ( error ) {
146+ reject ( error )
147+ }
148+ }
149+ this . _uploadElement . click ( )
150+ } )
151+ }
152+
73153 /**
74154 * 写入数据到本地文件
75155 *
@@ -79,8 +159,9 @@ module.exports = class BrowserBuffer {
79159 * @param {String | Object | Blob | ArrayBuffer } opt.data 写入的数据
80160 * @param {String } opt.MIME 仅当filename不带后缀名时生效,决定转换后数据的文件类型,默认为text/plain,txt文本。filename如果带上后缀名,则会覆盖MIME。
81161 * @param {String } opt.charset 文件的编码格式,默认为utf8
162+ * @returns {Promise } 因为是async函数,所以返回一个promise
82163 */
83- writeFile ( {
164+ async writeFile ( {
84165 filename= '' ,
85166 dataPath= '' ,
86167 data,
@@ -107,7 +188,8 @@ module.exports = class BrowserBuffer {
107188 else {
108189 throw new Error ( 'data must be string or object or Blob or ArrayBuffer' )
109190 }
110- this . _saveBuffer ( buf , filename , charset )
191+
192+ await this . _saveBuffer ( buf , filename , charset )
111193 }
112194 }
113195
0 commit comments