diff --git a/core/constants.js b/core/constants.js index bad64b9a..8385f912 100644 --- a/core/constants.js +++ b/core/constants.js @@ -1,5 +1,6 @@ module.exports = { QUERY_LIMITATION_DEFAULT: 20, + FILEBUCKET_BACKEND: 's3', // 存储信息 STORAGE_KEY: { diff --git a/core/utils/contentTypeMap.js b/core/utils/contentTypeMap.js new file mode 100644 index 00000000..6dab733b --- /dev/null +++ b/core/utils/contentTypeMap.js @@ -0,0 +1,179 @@ +module.exports = { + 'jpg': 'image/jpeg', + 'jpeg': 'image/jpeg', + 'jpe': 'image/jpeg', + 'png': 'image/png', + 'gif': 'image/gif', + 'apk': 'application/vnd.android.package-archive', + '3gp': 'video/3gpp', + 'ai': 'application/postscript', + 'aif': 'audio/x-aiff', + 'aifc': 'audio/x-aiff', + 'aiff': 'audio/x-aiff', + 'asc': 'text/plain', + 'atom': 'application/atom+xml', + 'au': 'audio/basic', + 'avi': 'video/x-msvideo', + 'bcpio': 'application/x-bcpio', + 'bin': 'application/octet-stream', + 'bmp': 'image/bmp', + 'cdf': 'application/x-netcdf', + 'cgm': 'image/cgm', + 'class': 'application/octet-stream', + 'cpio': 'application/x-cpio', + 'cpt': 'application/mac-compactpro', + 'csh': 'application/x-csh', + 'css': 'text/css', + 'dcr': 'application/x-director', + 'dif': 'video/x-dv', + 'dir': 'application/x-director', + 'djv': 'image/vnd.djvu', + 'djvu': 'image/vnd.djvu', + 'dll': 'application/octet-stream', + 'dmg': 'application/octet-stream', + 'dms': 'application/octet-stream', + 'doc': 'application/msword', + 'dtd': 'application/xml-dtd', + 'dv': 'video/x-dv', + 'dvi': 'application/x-dvi', + 'dxr': 'application/x-director', + 'eps': 'application/postscript', + 'etx': 'text/x-setext', + 'exe': 'application/octet-stream', + 'ez': 'application/andrew-inset', + 'flv': 'video/x-flv', + 'gram': 'application/srgs', + 'grxml': 'application/srgs+xml', + 'gtar': 'application/x-gtar', + 'gz': 'application/x-gzip', + 'hdf': 'application/x-hdf', + 'hqx': 'application/mac-binhex40', + 'htm': 'text/html', + 'html': 'text/html', + 'ice': 'x-conference/x-cooltalk', + 'ico': 'image/x-icon', + 'ics': 'text/calendar', + 'ief': 'image/ief', + 'ifb': 'text/calendar', + 'iges': 'model/iges', + 'igs': 'model/iges', + 'jnlp': 'application/x-java-jnlp-file', + 'jp2': 'image/jp2', + 'js': 'application/x-javascript', + 'kar': 'audio/midi', + 'latex': 'application/x-latex', + 'lha': 'application/octet-stream', + 'lzh': 'application/octet-stream', + 'm3u': 'audio/x-mpegurl', + 'm4a': 'audio/mp4a-latm', + 'm4p': 'audio/mp4a-latm', + 'm4u': 'video/vnd.mpegurl', + 'm4v': 'video/x-m4v', + 'mac': 'image/x-macpaint', + 'man': 'application/x-troff-man', + 'mathml': 'application/mathml+xml', + 'me': 'application/x-troff-me', + 'mesh': 'model/mesh', + 'mid': 'audio/midi', + 'midi': 'audio/midi', + 'mif': 'application/vnd.mif', + 'mov': 'video/quicktime', + 'movie': 'video/x-sgi-movie', + 'mp2': 'audio/mpeg', + 'mp3': 'audio/mpeg', + 'mp4': 'video/mp4', + 'mpe': 'video/mpeg', + 'mpeg': 'video/mpeg', + 'mpg': 'video/mpeg', + 'mpga': 'audio/mpeg', + 'ms': 'application/x-troff-ms', + 'msh': 'model/mesh', + 'mxu': 'video/vnd.mpegurl', + 'nc': 'application/x-netcdf', + 'oda': 'application/oda', + 'ogg': 'application/ogg', + 'ogv': 'video/ogv', + 'pbm': 'image/x-portable-bitmap', + 'pct': 'image/pict', + 'pdb': 'chemical/x-pdb', + 'pdf': 'application/pdf', + 'pgm': 'image/x-portable-graymap', + 'pgn': 'application/x-chess-pgn', + 'pic': 'image/pict', + 'pict': 'image/pict', + 'pnm': 'image/x-portable-anymap', + 'pnt': 'image/x-macpaint', + 'pntg': 'image/x-macpaint', + 'ppm': 'image/x-portable-pixmap', + 'ppt': 'application/vnd.ms-powerpoint', + 'ps': 'application/postscript', + 'qt': 'video/quicktime', + 'qti': 'image/x-quicktime', + 'qtif': 'image/x-quicktime', + 'ra': 'audio/x-pn-realaudio', + 'ram': 'audio/x-pn-realaudio', + 'ras': 'image/x-cmu-raster', + 'rdf': 'application/rdf+xml', + 'rgb': 'image/x-rgb', + 'rm': 'application/vnd.rn-realmedia', + 'roff': 'application/x-troff', + 'rtf': 'text/rtf', + 'rtx': 'text/richtext', + 'sgm': 'text/sgml', + 'sgml': 'text/sgml', + 'sh': 'application/x-sh', + 'shar': 'application/x-shar', + 'silo': 'model/mesh', + 'sit': 'application/x-stuffit', + 'skd': 'application/x-koan', + 'skm': 'application/x-koan', + 'skp': 'application/x-koan', + 'skt': 'application/x-koan', + 'smi': 'application/smil', + 'smil': 'application/smil', + 'snd': 'audio/basic', + 'so': 'application/octet-stream', + 'spl': 'application/x-futuresplash', + 'src': 'application/x-wais-source', + 'sv4cpio': 'application/x-sv4cpio', + 'sv4crc': 'application/x-sv4crc', + 'svg': 'image/svg+xml', + 'swf': 'application/x-shockwave-flash', + 't': 'application/x-troff', + 'tar': 'application/x-tar', + 'tcl': 'application/x-tcl', + 'tex': 'application/x-tex', + 'texi': 'application/x-texinfo', + 'texinfo': 'application/x-texinfo', + 'tif': 'image/tiff', + 'tiff': 'image/tiff', + 'tr': 'application/x-troff', + 'tsv': 'text/tab-separated-values', + 'txt': 'text/plain', + 'ustar': 'application/x-ustar', + 'vcd': 'application/x-cdlink', + 'vrml': 'model/vrml', + 'vxml': 'application/voicexml+xml', + 'wav': 'audio/x-wav', + 'wbmp': 'image/vnd.wap.wbmp', + 'wbxml': 'application/vnd.wap.wbxml', + 'webm': 'video/webm', + 'wml': 'text/vnd.wap.wml', + 'wmlc': 'application/vnd.wap.wmlc', + 'wmls': 'text/vnd.wap.wmlscript', + 'wmlsc': 'application/vnd.wap.wmlscriptc', + 'wmv': 'video/x-ms-wmv', + 'wrl': 'model/vrml', + 'xbm': 'image/x-xbitmap', + 'xht': 'application/xhtml+xml', + 'xhtml': 'application/xhtml+xml', + 'xls': 'application/vnd.ms-excel', + 'xml': 'application/xml', + 'xpm': 'image/x-xpixmap', + 'xsl': 'application/xml', + 'xslt': 'application/xslt+xml', + 'xul': 'application/vnd.mozilla.xul+xml', + 'xwd': 'image/x-xwindowdump', + 'xyz': 'chemical/x-xyz', + 'zip': 'application/zip' +} \ No newline at end of file diff --git a/sdk-file/src/wechat/uploadFile.js b/sdk-file/src/wechat/uploadFile.js index 9b9e8267..3ba0d0b9 100644 --- a/sdk-file/src/wechat/uploadFile.js +++ b/sdk-file/src/wechat/uploadFile.js @@ -2,10 +2,67 @@ const BaaS = require('core-module/baas') const constants = require('core-module/constants') const HError = require('core-module/HError') const utils = require('core-module/utils') +const contentType = require('core-module/utils/contentTypeMap') const {getUploadFileConfig, getUploadHeaders} = require('core-module/upload') const wxUpload = (config, resolve, reject, type) => { + + let uploadSuccess = (res) => { + let result = {} + let data = res.data || {} + + if (res.data) { + data = JSON.parse(res.data) + } + + result.status = 'ok' + result.path = config.destLink + result.file = { + 'id': config.id, + 'path': config.destLink, + 'name': config.fileName, + 'created_at': data.time || config.created_at, + 'mime_type': data.mimetype, + 'cdn_path': data.url, + 'size': data.file_size, + } + + delete res.data + + if (type && type === 'json') { + res.data = result + } else { + res.data = JSON.stringify(result) + } + + try { + resolve(utils.validateStatusCode(res)) + } catch (err) { + reject(err) + } + } + return getUploadHeaders().then(header => { + let extension = config.filePath.substring(config.filePath.lastIndexOf('.') + 1) + if (config.filebucketBackend === constants.FILEBUCKET_BACKEND) { + return wx.getFileSystemManager().readFile({ + filePath: config.filePath, + success: (data) => { + wx.request({ + url: config.uploadUrl, + method: 'PUT', + header: { + 'content-type': contentType[extension], + }, + data: data.data, + success: uploadSuccess, + fail: () => { + BaaS.request.wxRequestFail(reject) + } + }) + } + }) + } return wx.uploadFile({ url: config.uploadUrl, filePath: config.filePath, @@ -15,36 +72,7 @@ const wxUpload = (config, resolve, reject, type) => { policy: config.policy }, header, - success: (res) => { - let result = {} - let data = JSON.parse(res.data) - - result.status = 'ok' - result.path = config.destLink - result.file = { - 'id': config.id, - 'path': config.destLink, - 'name': config.fileName, - 'created_at': data.time, - 'mime_type': data.mimetype, - 'cdn_path': data.url, - 'size': data.file_size, - } - - delete res.data - - if (type && type === 'json') { - res.data = result - } else { - res.data = JSON.stringify(result) - } - - try { - resolve(utils.validateStatusCode(res)) - } catch (err) { - reject(err) - } - }, + success: uploadSuccess, fail: () => { BaaS.request.wxRequestFail(reject) } @@ -125,7 +153,8 @@ const uploadFile = (fileParams, metaData, type) => { authorization: res.data.authorization, uploadUrl: res.data.upload_url, filePath: fileParams.filePath, - destLink: res.data.path + destLink: res.data.path, + filebucketBackend: res.data.filebucket_backend, } uploadTask = wxUpload(config, e => { if (isAborted) return rj(new Error('aborted'))