From ebb0625f2cd1763412ba914777b40422b516da60 Mon Sep 17 00:00:00 2001 From: zhangjy Date: Fri, 23 Jul 2021 14:35:54 +0800 Subject: [PATCH] 14.35 --- pages/suggestion/suggestion.js | 3 +- project.config.json | 6 +- utils/FormData.js | 145 ++++++++++++++ utils/mimeMap.js | 345 +++++++++++++++++++++++++++++++++ 4 files changed, 495 insertions(+), 4 deletions(-) create mode 100644 utils/FormData.js create mode 100644 utils/mimeMap.js diff --git a/pages/suggestion/suggestion.js b/pages/suggestion/suggestion.js index e316a02..9e8c348 100644 --- a/pages/suggestion/suggestion.js +++ b/pages/suggestion/suggestion.js @@ -140,7 +140,8 @@ uplaodFile(files) { console.log('upload error', e.detail) }, uploadSuccess(e) { - // console.log(e.detail) + + console.log(e.detail) // $api.uploadImg(formData).then(res=>{ // console.log(res) diff --git a/project.config.json b/project.config.json index 818e0ae..3d357d7 100644 --- a/project.config.json +++ b/project.config.json @@ -37,9 +37,9 @@ "packNpmManually": false, "packNpmRelationList": [ { - "packageJsonPath": "./package.json", - "miniprogramNpmDistDir": "./miniprogram/" - } + "packageJsonPath": "./package.json", + "miniprogramNpmDistDir": "./miniprogram/" + } ], "minifyWXSS": true }, diff --git a/utils/FormData.js b/utils/FormData.js new file mode 100644 index 0000000..5d8d000 --- /dev/null +++ b/utils/FormData.js @@ -0,0 +1,145 @@ +const mimeMap = require('./mimeMap.js') + +function FormData(){ + let fileManager = wx.getFileSystemManager(); + let data = {}; + let files = []; + + this.append = (name, value)=>{ + data[name] = value; + return true; + } + + this.appendFile = (name, path)=>{ + let buffer = fileManager.readFileSync(path); + if(Object.prototype.toString.call(buffer).indexOf("ArrayBuffer") < 0){ + return false; + } + files.push({ + name: name, + buffer: buffer, + fileName: getFileNameFromPath(path) + }); + return true; + } + + this.getData = ()=>convert(data, files) +} + +function getFileNameFromPath(path){ + let idx=path.lastIndexOf("/"); + return path.substr(idx+1); +} + +function convert(data, files){ + let boundaryKey = 'wxmpFormBoundary' + randString(); // 数据分割符,一般是随机的字符串 + let boundary = '--' + boundaryKey; + let endBoundary = boundary + '--'; + + let postArray = []; + //拼接参数 + if(data && Object.prototype.toString.call(data) == "[object Object]"){ + for(let key in data){ + postArray = postArray.concat(formDataArray(boundary, key, data[key])); + } + } + //拼接文件 + if(files && Object.prototype.toString.call(files) == "[object Array]"){ + for(let i in files){ + let file = files[i]; + postArray = postArray.concat(formDataArray(boundary, file.name, file.buffer, file.fileName)); + } + } + //结尾 + let endBoundaryArray = []; + for (var i = 0; i < endBoundary.length; i++) { // 最后取出结束boundary的charCode + endBoundaryArray.push(...endBoundary.utf8CodeAt(i)); + } + postArray = postArray.concat(endBoundaryArray); + return { + contentType: 'multipart/form-data; boundary=' + boundaryKey, + buffer: new Uint8Array(postArray).buffer + } +} + +function randString() { + let res = ""; + for (let i = 0; i < 17; i++) { + let n = parseInt(Math.random() * 62); + if (n <= 9) { + res += n; + } + else if (n <= 35) { + res += String.fromCharCode(n + 55); + } + else { + res += String.fromCharCode(n + 61); + } + } + return res; +} + +function formDataArray(boundary, name, value, fileName){ + let dataString = ''; + let isFile = !!fileName; + + dataString += boundary + '\r\n'; + dataString += 'Content-Disposition: form-data; name="' + name + '"'; + if (isFile){ + dataString += '; filename="' + fileName + '"' + '\r\n'; + dataString += 'Content-Type: ' + getFileMime(fileName) + '\r\n\r\n'; + } + else{ + dataString += '\r\n\r\n'; + dataString += value; + } + + var dataArray = []; + for (var i = 0; i < dataString.length; i++) { // 取出文本的charCode(10进制) + dataArray.push(...dataString.utf8CodeAt(i)); + } + + if (isFile) { + let fileArray = new Uint8Array(value); + dataArray = dataArray.concat(Array.prototype.slice.call(fileArray)); + } + dataArray.push(..."\r".utf8CodeAt()); + dataArray.push(..."\n".utf8CodeAt()); + + return dataArray; +} + +function getFileMime(fileName){ + let idx = fileName.lastIndexOf("."); + let mime = mimeMap[fileName.substr(idx)]; + return mime?mime:"application/octet-stream" +} + +String.prototype.utf8CodeAt = function(i) { + var str = this; + var out = [], p = 0; + var c = str.charCodeAt(i); + if (c < 128) { + out[p++] = c; + } else if (c < 2048) { + out[p++] = (c >> 6) | 192; + out[p++] = (c & 63) | 128; + } else if ( + ((c & 0xFC00) == 0xD800) && (i + 1) < str.length && + ((str.charCodeAt(i + 1) & 0xFC00) == 0xDC00)) { + // Surrogate Pair + c = 0x10000 + ((c & 0x03FF) << 10) + (str.charCodeAt(++i) & 0x03FF); + out[p++] = (c >> 18) | 240; + out[p++] = ((c >> 12) & 63) | 128; + out[p++] = ((c >> 6) & 63) | 128; + out[p++] = (c & 63) | 128; + } else { + out[p++] = (c >> 12) | 224; + out[p++] = ((c >> 6) & 63) | 128; + out[p++] = (c & 63) | 128; + } + return out; +}; + + +module.exports = FormData; \ No newline at end of file diff --git a/utils/mimeMap.js b/utils/mimeMap.js new file mode 100644 index 0000000..fea9b28 --- /dev/null +++ b/utils/mimeMap.js @@ -0,0 +1,345 @@ +module.exports = { + "0.001": "application/x-001", + "0.323": "text/h323", + "0.907": "drawing/907", + ".acp": "audio/x-mei-aac", + ".aif": "audio/aiff", + ".aiff": "audio/aiff", + ".asa": "text/asa", + ".asp": "text/asp", + ".au": "audio/basic", + ".awf": "application/vnd.adobe.workflow", + ".bmp": "application/x-bmp", + ".c4t": "application/x-c4t", + ".cal": "application/x-cals", + ".cdf": "application/x-netcdf", + ".cel": "application/x-cel", + ".cg4": "application/x-g4", + ".cit": "application/x-cit", + ".cml": "text/xml", + ".cmx": "application/x-cmx", + ".crl": "application/pkix-crl", + ".csi": "application/x-csi", + ".cut": "application/x-cut", + ".dbm": "application/x-dbm", + ".dcd": "text/xml", + ".der": "application/x-x509-ca-cert", + ".dib": "application/x-dib", + ".doc": "application/msword", + ".drw": "application/x-drw", + ".dwf": "Model/vnd.dwf", + ".dwg": "application/x-dwg", + ".dxf": "application/x-dxf", + ".emf": "application/x-emf", + ".ent": "text/xml", + ".eps": "application/x-ps", + ".etd": "application/x-ebx", + ".fax": "image/fax", + ".fif": "application/fractals", + ".frm": "application/x-frm", + ".gbr": "application/x-gbr", + ".gif": "image/gif", + ".gp4": "application/x-gp4", + ".hmr": "application/x-hmr", + ".hpl": "application/x-hpl", + ".hrf": "application/x-hrf", + ".htc": "text/x-component", + ".html": "text/html", + ".htx": "text/html", + ".ico": "image/x-icon", + ".iff": "application/x-iff", + ".igs": "application/x-igs", + ".img": "application/x-img", + ".isp": "application/x-internet-signup", + ".java": "java/*", + ".jpe": "image/jpeg", + ".jpeg": "image/jpeg", + ".jpg": "application/x-jpg", + ".jsp": "text/html", + ".lar": "application/x-laplayer-reg", + ".lavs": "audio/x-liquid-secure", + ".lmsff": "audio/x-la-lms", + ".ltr": "application/x-ltr", + ".m2v": "video/x-mpeg", + ".m4e": "video/mpeg4", + ".man": "application/x-troff-man", + ".mdb": "application/msaccess", + ".mfp": "application/x-shockwave-flash", + ".mhtml": "message/rfc822", + ".mid": "audio/mid", + ".mil": "application/x-mil", + ".mnd": "audio/x-musicnet-download", + ".mocha": "application/x-javascript", + ".mp1": "audio/mp1", + ".mp2v": "video/mpeg", + ".mp4": "video/mpeg4", + ".mpd": "application/vnd.ms-project", + ".mpeg": "video/mpg", + ".mpga": "audio/rn-mpeg", + ".mps": "video/x-mpeg", + ".mpv": "video/mpg", + ".mpw": "application/vnd.ms-project", + ".mtx": "text/xml", + ".net": "image/pnetvue", + ".nws": "message/rfc822", + ".out": "application/x-out", + ".p12": "application/x-pkcs12", + ".p7c": "application/pkcs7-mime", + ".p7r": "application/x-pkcs7-certreqresp", + ".pc5": "application/x-pc5", + ".pcl": "application/x-pcl", + ".pdf": "application/pdf", + ".pdx": "application/vnd.adobe.pdx", + ".pgl": "application/x-pgl", + ".pko": "application/vnd.ms-pki.pko", + ".plg": "text/html", + ".plt": "application/x-plt", + ".png": "application/x-png", + ".ppa": "application/vnd.ms-powerpoint", + ".pps": "application/vnd.ms-powerpoint", + ".ppt": "application/x-ppt", + ".prf": "application/pics-rules", + ".prt": "application/x-prt", + ".ps": "application/postscript", + ".pwz": "application/vnd.ms-powerpoint", + ".ra": "audio/vnd.rn-realaudio", + ".ras": "application/x-ras", + ".rdf": "text/xml", + ".red": "application/x-red", + ".rjs": "application/vnd.rn-realsystem-rjs", + ".rlc": "application/x-rlc", + ".rm": "application/vnd.rn-realmedia", + ".rmi": "audio/mid", + ".rmm": "audio/x-pn-realaudio", + ".rms": "application/vnd.rn-realmedia-secure", + ".rmx": "application/vnd.rn-realsystem-rmx", + ".rp": "image/vnd.rn-realpix", + ".rsml": "application/vnd.rn-rsml", + ".rtf": "application/msword", + ".rv": "video/vnd.rn-realvideo", + ".sat": "application/x-sat", + ".sdw": "application/x-sdw", + ".slb": "application/x-slb", + ".slk": "drawing/x-slk", + ".smil": "application/smil", + ".snd": "audio/basic", + ".sor": "text/plain", + ".spl": "application/futuresplash", + ".ssm": "application/streamingmedia", + ".stl": "application/vnd.ms-pki.stl", + ".sty": "application/x-sty", + ".swf": "application/x-shockwave-flash", + ".tg4": "application/x-tg4", + ".tif": "image/tiff", + ".tiff": "image/tiff", + ".top": "drawing/x-top", + ".tsd": "text/xml", + ".uin": "application/x-icq", + ".vcf": "text/x-vcard", + ".vdx": "application/vnd.visio", + ".vpg": "application/x-vpeg005", + ".vsd": "application/x-vsd", + ".vst": "application/vnd.visio", + ".vsw": "application/vnd.visio", + ".vtx": "application/vnd.visio", + ".wav": "audio/wav", + ".wb1": "application/x-wb1", + ".wb3": "application/x-wb3", + ".wiz": "application/msword", + ".wk4": "application/x-wk4", + ".wks": "application/x-wks", + ".wma": "audio/x-ms-wma", + ".wmf": "application/x-wmf", + ".wmv": "video/x-ms-wmv", + ".wmz": "application/x-ms-wmz", + ".wpd": "application/x-wpd", + ".wpl": "application/vnd.ms-wpl", + ".wr1": "application/x-wr1", + ".wrk": "application/x-wrk", + ".ws2": "application/x-ws", + ".wsdl": "text/xml", + ".xdp": "application/vnd.adobe.xdp", + ".xfd": "application/vnd.adobe.xfd", + ".xhtml": "text/html", + ".xls": "application/x-xls", + ".xml": "text/xml", + ".xq": "text/xml", + ".xquery": "text/xml", + ".xsl": "text/xml", + ".xwd": "application/x-xwd", + ".sis": "application/vnd.symbian.install", + ".x_t": "application/x-x_t", + ".apk": "application/vnd.android.package-archive", + "0.301": "application/x-301", + "0.906": "application/x-906", + ".a11": "application/x-a11", + ".ai": "application/postscript", + ".aifc": "audio/aiff", + ".anv": "application/x-anv", + ".asf": "video/x-ms-asf", + ".asx": "video/x-ms-asf", + ".avi": "video/avi", + ".biz": "text/xml", + ".bot": "application/x-bot", + ".c90": "application/x-c90", + ".cat": "application/vnd.ms-pki.seccat", + ".cdr": "application/x-cdr", + ".cer": "application/x-x509-ca-cert", + ".cgm": "application/x-cgm", + ".class": "java/*", + ".cmp": "application/x-cmp", + ".cot": "application/x-cot", + ".crt": "application/x-x509-ca-cert", + ".css": "text/css", + ".dbf": "application/x-dbf", + ".dbx": "application/x-dbx", + ".dcx": "application/x-dcx", + ".dgn": "application/x-dgn", + ".dll": "application/x-msdownload", + ".dot": "application/msword", + ".dtd": "text/xml", + ".dwf": "application/x-dwf", + ".dxb": "application/x-dxb", + ".edn": "application/vnd.adobe.edn", + ".eml": "message/rfc822", + ".epi": "application/x-epi", + ".eps": "application/postscript", + ".exe": "application/x-msdownload", + ".fdf": "application/vnd.fdf", + ".fo": "text/xml", + ".g4": "application/x-g4", + ".tif": "image/tiff", + ".gl2": "application/x-gl2", + ".hgl": "application/x-hgl", + ".hpg": "application/x-hpgl", + ".hqx": "application/mac-binhex40", + ".hta": "application/hta", + ".htm": "text/html", + ".htt": "text/webviewhtml", + ".icb": "application/x-icb", + ".ico": "application/x-ico", + ".ig4": "application/x-g4", + ".iii": "application/x-iphone", + ".ins": "application/x-internet-signup", + ".IVF": "video/x-ivf", + ".jfif": "image/jpeg", + ".jpe": "application/x-jpe", + ".jpg": "image/jpeg", + ".js": "application/x-javascript", + ".la1": "audio/x-liquid-file", + ".latex": "application/x-latex", + ".lbm": "application/x-lbm", + ".ls": "application/x-javascript", + ".m1v": "video/x-mpeg", + ".m3u": "audio/mpegurl", + ".mac": "application/x-mac", + ".math": "text/xml", + ".mdb": "application/x-mdb", + ".mht": "message/rfc822", + ".mi": "application/x-mi", + ".midi": "audio/mid", + ".mml": "text/xml", + ".mns": "audio/x-musicnet-stream", + ".movie": "video/x-sgi-movie", + ".mp2": "audio/mp2", + ".mp3": "audio/mp3", + ".mpa": "video/x-mpg", + ".mpe": "video/x-mpeg", + ".mpg": "video/mpg", + ".mpp": "application/vnd.ms-project", + ".mpt": "application/vnd.ms-project", + ".mpv2": "video/mpeg", + ".mpx": "application/vnd.ms-project", + ".mxp": "application/x-mmxp", + ".nrf": "application/x-nrf", + ".odc": "text/x-ms-odc", + ".p10": "application/pkcs10", + ".p7b": "application/x-pkcs7-certificates", + ".p7m": "application/pkcs7-mime", + ".p7s": "application/pkcs7-signature", + ".pci": "application/x-pci", + ".pcx": "application/x-pcx", + ".pdf": "application/pdf", + ".pfx": "application/x-pkcs12", + ".pic": "application/x-pic", + ".pl": "application/x-perl", + ".pls": "audio/scpls", + ".png": "image/png", + ".pot": "application/vnd.ms-powerpoint", + ".ppm": "application/x-ppm", + ".ppt": "application/vnd.ms-powerpoint", + ".pr": "application/x-pr", + ".prn": "application/x-prn", + ".ps": "application/x-ps", + ".ptn": "application/x-ptn", + ".r3t": "text/vnd.rn-realtext3d", + ".ram": "audio/x-pn-realaudio", + ".rat": "application/rat-file", + ".rec": "application/vnd.rn-recording", + ".rgb": "application/x-rgb", + ".rjt": "application/vnd.rn-realsystem-rjt", + ".rle": "application/x-rle", + ".rmf": "application/vnd.adobe.rmf", + ".rmj": "application/vnd.rn-realsystem-rmj", + ".rmp": "application/vnd.rn-rn_music_package", + ".rmvb": "application/vnd.rn-realmedia-vbr", + ".rnx": "application/vnd.rn-realplayer", + ".rpm": "audio/x-pn-realaudio-plugin", + ".rt": "text/vnd.rn-realtext", + ".rtf": "application/x-rtf", + ".sam": "application/x-sam", + ".sdp": "application/sdp", + ".sit": "application/x-stuffit", + ".sld": "application/x-sld", + ".smi": "application/smil", + ".smk": "application/x-smk", + ".sol": "text/plain", + ".spc": "application/x-pkcs7-certificates", + ".spp": "text/xml", + ".sst": "application/vnd.ms-pki.certstore", + ".stm": "text/html", + ".svg": "text/xml", + ".tdf": "application/x-tdf", + ".tga": "application/x-tga", + ".tif": "application/x-tif", + ".tld": "text/xml", + ".torrent": "application/x-bittorrent", + ".txt": "text/plain", + ".uls": "text/iuls", + ".vda": "application/x-vda", + ".vml": "text/xml", + ".vsd": "application/vnd.visio", + ".vss": "application/vnd.visio", + ".vst": "application/x-vst", + ".vsx": "application/vnd.visio", + ".vxml": "text/xml", + ".wax": "audio/x-ms-wax", + ".wb2": "application/x-wb2", + ".wbmp": "image/vnd.wap.wbmp", + ".wk3": "application/x-wk3", + ".wkq": "application/x-wkq", + ".wm": "video/x-ms-wm", + ".wmd": "application/x-ms-wmd", + ".wml": "text/vnd.wap.wml", + ".wmx": "video/x-ms-wmx", + ".wp6": "application/x-wp6", + ".wpg": "application/x-wpg", + ".wq1": "application/x-wq1", + ".wri": "application/x-wri", + ".ws": "application/x-ws", + ".wsc": "text/scriptlet", + ".wvx": "video/x-ms-wvx", + ".xdr": "text/xml", + ".xfdf": "application/vnd.adobe.xfdf", + ".xls": "application/vnd.ms-excel", + ".xlw": "application/x-xlw", + ".xpl": "audio/scpls", + ".xql": "text/xml", + ".xsd": "text/xml", + ".xslt": "text/xml", + ".x_b": "application/x-x_b", + ".sisx": "application/vnd.symbian.install", + ".ipa": "application/vnd.iphone", + ".xap": "application/x-silverlight-app", + ".zip": "application/x-zip-compressed", +} \ No newline at end of file