• 微信小程序接口请求/form-data/单文件、多文件上传


    1、普通的微信请求封装

    复制代码
     1 const http = (options) =>{
     2   return new Promise((resolve,reject) => {
     3     wx.request({
     4       url: options.url,
     5       method:options.method || 'get',
     6       data:options.data || {},
     7       header: options.header || {
     8         'content-type':'application/json; charset=utf-8'
     9       },
    10       success:resolve,
    11       fail:reject
    12     })
    13   })
    14 }
    15 export default http
    复制代码

    在自己写的api.js里import后export

    复制代码
     1 import http from '../http/http.js' 
     2 
     3 const functionName = (val1,val2) => {
     4   return http({
     5     url:'url',
     6     data: {},
     7     method: 'get', //post
     8     header:{}
     9   })
    10 }
    11 
    12 export default{
    13     functionName
    14 }
    复制代码

    在需要使用api的页面import后调用方法即可

     1 import api from '../api/api.js' 2 3 api.functionName().then(res =>{ 4 5 console.log(res) 5 6 7 }) 

    2、原生微信小程序请求不支持multipart/form-data,当后端接口要求此类型请求时,就需要换一种写法

    复制代码
     1 wx.request({
     2   url:'url',
     3   method:'POST', //GET
     4   header: {
     5     'content-type':'multipart/form-data; boundary=XXX', //XXX是分隔符的意思
     6   },
     7   data:'\r\n--XXX' +
     8     '\r\nContent-Disposition: form-data; name="key1"' +      //第一个参数key1:val1,固定写法以此类推
     9     '\r\n' +
    10     '\r\n' + val1 +
    11     '\r\n--XXX' +
    12     '\r\nContent-Disposition: form-data; name="key2"' +
    13     '\r\n' +
    14     '\r\n' + val2 +
    15     '\r\n--XXX--',
    16     success(res){
    17       console.log(res)
    18     }
    19 })
    复制代码

    3、对于图片上传,微信小程序有原生的api可以直接调用,不过仅支持单文件上传

    复制代码
     1 wx.uploadFile({
     2         url: 'url', 
     3         filePath: imgSrc, //imgSrc是微信小程wx.chooseImage等图片选择接口生成图片的tempFilePaths,无论后端能接收多少个这里都只能放一个,这是这个接口的限制
     4         name: 'image',   //后端接收图片的字段名
     5         //请求头
     6         header:{
     7           'token':token,
     8           'content-type':'multipart/form-data',
     9         },
    10         //携带的其他参数可以放在这
    11         formData: {
    12           key1:val1,
    13           key2:val2,
    14         },
    15         success (res){
    16           console.log(res)
    17         }
    18       })
    复制代码

    4、微信小程序原生接口仅支持单文件上传,当需要多图片同时上传时,无法使用循环或者递归的方式上传图片(所以和后端对接要多多沟通),微信小程序无内置formData对象,所以处理起来麻烦点

    首先,前往这里:https://github.com/zlyboy/wx-formdata 下载formData.js和mimeMap.js两个文件放进小程序目录里,github上也有对wx-formdata的详细使用说明,也可直接新建js文件复制文末的代码,最好就去看看github

    完成了两个js的下载就可以直接使用了

    复制代码
     1 import FormData from '../formdata'
     2 
     3 let formData = new FormData();    //新建一个formData对象
     4 formData.append("key1", val1);    //写入参数
     5 formData.append("key2", val2);
     6 
     7 //图片,依旧用原生接口选择图片,生成的tempFilePaths是一个图片链接数组,具体去看官方文档
     8 for(let i in tempFilePaths){
     9       formData.appendFile("image", that.data.tempFilePaths[i]);
    10 }
    11 
    12 let data = formData.getData();
    13 
    14 //参数写好后,正常请求就好
    15     wx.request({
    16       url: 'url',
    17       method: 'post',
    18       header: {
    19         'content-type': data.contentType,
    20         'token':token,
    21       },
    22       data: data.buffer,
    23       success (res){
    24         console.log(res)
    25       }
    26     });
    复制代码

     

    这个是mimeMap.js

    复制代码
      1 //文件mimeMap.js,由formData.js引用
      2 module.exports = {
      3   "0.001": "application/x-001",
      4   "0.323": "text/h323",
      5   "0.907": "drawing/907",
      6   ".acp": "audio/x-mei-aac",
      7   ".aif": "audio/aiff",
      8   ".aiff": "audio/aiff",
      9   ".asa": "text/asa",
     10   ".asp": "text/asp",
     11   ".au": "audio/basic",
     12   ".awf": "application/vnd.adobe.workflow",
     13   ".bmp": "application/x-bmp",
     14   ".c4t": "application/x-c4t",
     15   ".cal": "application/x-cals",
     16   ".cdf": "application/x-netcdf",
     17   ".cel": "application/x-cel",
     18   ".cg4": "application/x-g4",
     19   ".cit": "application/x-cit",
     20   ".cml": "text/xml",
     21   ".cmx": "application/x-cmx",
     22   ".crl": "application/pkix-crl",
     23   ".csi": "application/x-csi",
     24   ".cut": "application/x-cut",
     25   ".dbm": "application/x-dbm",
     26   ".dcd": "text/xml",
     27   ".der": "application/x-x509-ca-cert",
     28   ".dib": "application/x-dib",
     29   ".doc": "application/msword",
     30   ".drw": "application/x-drw",
     31   ".dwf": "Model/vnd.dwf",
     32   ".dwg": "application/x-dwg",
     33   ".dxf": "application/x-dxf",
     34   ".emf": "application/x-emf",
     35   ".ent": "text/xml",
     36   ".eps": "application/x-ps",
     37   ".etd": "application/x-ebx",
     38   ".fax": "image/fax",
     39   ".fif": "application/fractals",
     40   ".frm": "application/x-frm",
     41   ".gbr": "application/x-gbr",
     42   ".gif": "image/gif",
     43   ".gp4": "application/x-gp4",
     44   ".hmr": "application/x-hmr",
     45   ".hpl": "application/x-hpl",
     46   ".hrf": "application/x-hrf",
     47   ".htc": "text/x-component",
     48   ".html": "text/html",
     49   ".htx": "text/html",
     50   ".ico": "image/x-icon",
     51   ".iff": "application/x-iff",
     52   ".igs": "application/x-igs",
     53   ".img": "application/x-img",
     54   ".isp": "application/x-internet-signup",
     55   ".java": "java/*",
     56   ".jpe": "image/jpeg",
     57   ".jpeg": "image/jpeg",
     58   ".jpg": "application/x-jpg",
     59   ".jsp": "text/html",
     60   ".lar": "application/x-laplayer-reg",
     61   ".lavs": "audio/x-liquid-secure",
     62   ".lmsff": "audio/x-la-lms",
     63   ".ltr": "application/x-ltr",
     64   ".m2v": "video/x-mpeg",
     65   ".m4e": "video/mpeg4",
     66   ".man": "application/x-troff-man",
     67   ".mdb": "application/msaccess",
     68   ".mfp": "application/x-shockwave-flash",
     69   ".mhtml": "message/rfc822",
     70   ".mid": "audio/mid",
     71   ".mil": "application/x-mil",
     72   ".mnd": "audio/x-musicnet-download",
     73   ".mocha": "application/x-javascript",
     74   ".mp1": "audio/mp1",
     75   ".mp2v": "video/mpeg",
     76   ".mp4": "video/mpeg4",
     77   ".mpd": "application/vnd.ms-project",
     78   ".mpeg": "video/mpg",
     79   ".mpga": "audio/rn-mpeg",
     80   ".mps": "video/x-mpeg",
     81   ".mpv": "video/mpg",
     82   ".mpw": "application/vnd.ms-project",
     83   ".mtx": "text/xml",
     84   ".net": "image/pnetvue",
     85   ".nws": "message/rfc822",
     86   ".out": "application/x-out",
     87   ".p12": "application/x-pkcs12",
     88   ".p7c": "application/pkcs7-mime",
     89   ".p7r": "application/x-pkcs7-certreqresp",
     90   ".pc5": "application/x-pc5",
     91   ".pcl": "application/x-pcl",
     92   ".pdf": "application/pdf",
     93   ".pdx": "application/vnd.adobe.pdx",
     94   ".pgl": "application/x-pgl",
     95   ".pko": "application/vnd.ms-pki.pko",
     96   ".plg": "text/html",
     97   ".plt": "application/x-plt",
     98   ".png": "application/x-png",
     99   ".ppa": "application/vnd.ms-powerpoint",
    100   ".pps": "application/vnd.ms-powerpoint",
    101   ".ppt": "application/x-ppt",
    102   ".prf": "application/pics-rules",
    103   ".prt": "application/x-prt",
    104   ".ps": "application/postscript",
    105   ".pwz": "application/vnd.ms-powerpoint",
    106   ".ra": "audio/vnd.rn-realaudio",
    107   ".ras": "application/x-ras",
    108   ".rdf": "text/xml",
    109   ".red": "application/x-red",
    110   ".rjs": "application/vnd.rn-realsystem-rjs",
    111   ".rlc": "application/x-rlc",
    112   ".rm": "application/vnd.rn-realmedia",
    113   ".rmi": "audio/mid",
    114   ".rmm": "audio/x-pn-realaudio",
    115   ".rms": "application/vnd.rn-realmedia-secure",
    116   ".rmx": "application/vnd.rn-realsystem-rmx",
    117   ".rp": "image/vnd.rn-realpix",
    118   ".rsml": "application/vnd.rn-rsml",
    119   ".rtf": "application/msword",
    120   ".rv": "video/vnd.rn-realvideo",
    121   ".sat": "application/x-sat",
    122   ".sdw": "application/x-sdw",
    123   ".slb": "application/x-slb",
    124   ".slk": "drawing/x-slk",
    125   ".smil": "application/smil",
    126   ".snd": "audio/basic",
    127   ".sor": "text/plain",
    128   ".spl": "application/futuresplash",
    129   ".ssm": "application/streamingmedia",
    130   ".stl": "application/vnd.ms-pki.stl",
    131   ".sty": "application/x-sty",
    132   ".swf": "application/x-shockwave-flash",
    133   ".tg4": "application/x-tg4",
    134   ".tif": "image/tiff",
    135   ".tiff": "image/tiff",
    136   ".top": "drawing/x-top",
    137   ".tsd": "text/xml",
    138   ".uin": "application/x-icq",
    139   ".vcf": "text/x-vcard",
    140   ".vdx": "application/vnd.visio",
    141   ".vpg": "application/x-vpeg005",
    142   ".vsd": "application/x-vsd",
    143   ".vst": "application/vnd.visio",
    144   ".vsw": "application/vnd.visio",
    145   ".vtx": "application/vnd.visio",
    146   ".wav": "audio/wav",
    147   ".wb1": "application/x-wb1",
    148   ".wb3": "application/x-wb3",
    149   ".wiz": "application/msword",
    150   ".wk4": "application/x-wk4",
    151   ".wks": "application/x-wks",
    152   ".wma": "audio/x-ms-wma",
    153   ".wmf": "application/x-wmf",
    154   ".wmv": "video/x-ms-wmv",
    155   ".wmz": "application/x-ms-wmz",
    156   ".wpd": "application/x-wpd",
    157   ".wpl": "application/vnd.ms-wpl",
    158   ".wr1": "application/x-wr1",
    159   ".wrk": "application/x-wrk",
    160   ".ws2": "application/x-ws",
    161   ".wsdl": "text/xml",
    162   ".xdp": "application/vnd.adobe.xdp",
    163   ".xfd": "application/vnd.adobe.xfd",
    164   ".xhtml": "text/html",
    165   ".xls": "application/x-xls",
    166   ".xml": "text/xml",
    167   ".xq": "text/xml",
    168   ".xquery": "text/xml",
    169   ".xsl": "text/xml",
    170   ".xwd": "application/x-xwd",
    171   ".sis": "application/vnd.symbian.install",
    172   ".x_t": "application/x-x_t",
    173   ".apk": "application/vnd.android.package-archive",
    174   "0.301": "application/x-301",
    175   "0.906": "application/x-906",
    176   ".a11": "application/x-a11",
    177   ".ai": "application/postscript",
    178   ".aifc": "audio/aiff",
    179   ".anv": "application/x-anv",
    180   ".asf": "video/x-ms-asf",
    181   ".asx": "video/x-ms-asf",
    182   ".avi": "video/avi",
    183   ".biz": "text/xml",
    184   ".bot": "application/x-bot",
    185   ".c90": "application/x-c90",
    186   ".cat": "application/vnd.ms-pki.seccat",
    187   ".cdr": "application/x-cdr",
    188   ".cer": "application/x-x509-ca-cert",
    189   ".cgm": "application/x-cgm",
    190   ".class": "java/*",
    191   ".cmp": "application/x-cmp",
    192   ".cot": "application/x-cot",
    193   ".crt": "application/x-x509-ca-cert",
    194   ".css": "text/css",
    195   ".dbf": "application/x-dbf",
    196   ".dbx": "application/x-dbx",
    197   ".dcx": "application/x-dcx",
    198   ".dgn": "application/x-dgn",
    199   ".dll": "application/x-msdownload",
    200   ".dot": "application/msword",
    201   ".dtd": "text/xml",
    202   ".dwf": "application/x-dwf",
    203   ".dxb": "application/x-dxb",
    204   ".edn": "application/vnd.adobe.edn",
    205   ".eml": "message/rfc822",
    206   ".epi": "application/x-epi",
    207   ".eps": "application/postscript",
    208   ".exe": "application/x-msdownload",
    209   ".fdf": "application/vnd.fdf",
    210   ".fo": "text/xml",
    211   ".g4": "application/x-g4",
    212   ".tif": "image/tiff",
    213   ".gl2": "application/x-gl2",
    214   ".hgl": "application/x-hgl",
    215   ".hpg": "application/x-hpgl",
    216   ".hqx": "application/mac-binhex40",
    217   ".hta": "application/hta",
    218   ".htm": "text/html",
    219   ".htt": "text/webviewhtml",
    220   ".icb": "application/x-icb",
    221   ".ico": "application/x-ico",
    222   ".ig4": "application/x-g4",
    223   ".iii": "application/x-iphone",
    224   ".ins": "application/x-internet-signup",
    225   ".IVF": "video/x-ivf",
    226   ".jfif": "image/jpeg",
    227   ".jpe": "application/x-jpe",
    228   ".jpg": "image/jpeg",
    229   ".js": "application/x-javascript",
    230   ".la1": "audio/x-liquid-file",
    231   ".latex": "application/x-latex",
    232   ".lbm": "application/x-lbm",
    233   ".ls": "application/x-javascript",
    234   ".m1v": "video/x-mpeg",
    235   ".m3u": "audio/mpegurl",
    236   ".mac": "application/x-mac",
    237   ".math": "text/xml",
    238   ".mdb": "application/x-mdb",
    239   ".mht": "message/rfc822",
    240   ".mi": "application/x-mi",
    241   ".midi": "audio/mid",
    242   ".mml": "text/xml",
    243   ".mns": "audio/x-musicnet-stream",
    244   ".movie": "video/x-sgi-movie",
    245   ".mp2": "audio/mp2",
    246   ".mp3": "audio/mp3",
    247   ".mpa": "video/x-mpg",
    248   ".mpe": "video/x-mpeg",
    249   ".mpg": "video/mpg",
    250   ".mpp": "application/vnd.ms-project",
    251   ".mpt": "application/vnd.ms-project",
    252   ".mpv2": "video/mpeg",
    253   ".mpx": "application/vnd.ms-project",
    254   ".mxp": "application/x-mmxp",
    255   ".nrf": "application/x-nrf",
    256   ".odc": "text/x-ms-odc",
    257   ".p10": "application/pkcs10",
    258   ".p7b": "application/x-pkcs7-certificates",
    259   ".p7m": "application/pkcs7-mime",
    260   ".p7s": "application/pkcs7-signature",
    261   ".pci": "application/x-pci",
    262   ".pcx": "application/x-pcx",
    263   ".pdf": "application/pdf",
    264   ".pfx": "application/x-pkcs12",
    265   ".pic": "application/x-pic",
    266   ".pl": "application/x-perl",
    267   ".pls": "audio/scpls",
    268   ".png": "image/png",
    269   ".pot": "application/vnd.ms-powerpoint",
    270   ".ppm": "application/x-ppm",
    271   ".ppt": "application/vnd.ms-powerpoint",
    272   ".pr": "application/x-pr",
    273   ".prn": "application/x-prn",
    274   ".ps": "application/x-ps",
    275   ".ptn": "application/x-ptn",
    276   ".r3t": "text/vnd.rn-realtext3d",
    277   ".ram": "audio/x-pn-realaudio",
    278   ".rat": "application/rat-file",
    279   ".rec": "application/vnd.rn-recording",
    280   ".rgb": "application/x-rgb",
    281   ".rjt": "application/vnd.rn-realsystem-rjt",
    282   ".rle": "application/x-rle",
    283   ".rmf": "application/vnd.adobe.rmf",
    284   ".rmj": "application/vnd.rn-realsystem-rmj",
    285   ".rmp": "application/vnd.rn-rn_music_package",
    286   ".rmvb": "application/vnd.rn-realmedia-vbr",
    287   ".rnx": "application/vnd.rn-realplayer",
    288   ".rpm": "audio/x-pn-realaudio-plugin",
    289   ".rt": "text/vnd.rn-realtext",
    290   ".rtf": "application/x-rtf",
    291   ".sam": "application/x-sam",
    292   ".sdp": "application/sdp",
    293   ".sit": "application/x-stuffit",
    294   ".sld": "application/x-sld",
    295   ".smi": "application/smil",
    296   ".smk": "application/x-smk",
    297   ".sol": "text/plain",
    298   ".spc": "application/x-pkcs7-certificates",
    299   ".spp": "text/xml",
    300   ".sst": "application/vnd.ms-pki.certstore",
    301   ".stm": "text/html",
    302   ".svg": "text/xml",
    303   ".tdf": "application/x-tdf",
    304   ".tga": "application/x-tga",
    305   ".tif": "application/x-tif",
    306   ".tld": "text/xml",
    307   ".torrent": "application/x-bittorrent",
    308   ".txt": "text/plain",
    309   ".uls": "text/iuls",
    310   ".vda": "application/x-vda",
    311   ".vml": "text/xml",
    312   ".vsd": "application/vnd.visio",
    313   ".vss": "application/vnd.visio",
    314   ".vst": "application/x-vst",
    315   ".vsx": "application/vnd.visio",
    316   ".vxml": "text/xml",
    317   ".wax": "audio/x-ms-wax",
    318   ".wb2": "application/x-wb2",
    319   ".wbmp": "image/vnd.wap.wbmp",
    320   ".wk3": "application/x-wk3",
    321   ".wkq": "application/x-wkq",
    322   ".wm": "video/x-ms-wm",
    323   ".wmd": "application/x-ms-wmd",
    324   ".wml": "text/vnd.wap.wml",
    325   ".wmx": "video/x-ms-wmx",
    326   ".wp6": "application/x-wp6",
    327   ".wpg": "application/x-wpg",
    328   ".wq1": "application/x-wq1",
    329   ".wri": "application/x-wri",
    330   ".ws": "application/x-ws",
    331   ".wsc": "text/scriptlet",
    332   ".wvx": "video/x-ms-wvx",
    333   ".xdr": "text/xml",
    334   ".xfdf": "application/vnd.adobe.xfdf",
    335   ".xls": "application/vnd.ms-excel",
    336   ".xlw": "application/x-xlw",
    337   ".xpl": "audio/scpls",
    338   ".xql": "text/xml",
    339   ".xsd": "text/xml",
    340   ".xslt": "text/xml",
    341   ".x_b": "application/x-x_b",
    342   ".sisx": "application/vnd.symbian.install",
    343   ".ipa": "application/vnd.iphone",
    344   ".xap": "application/x-silverlight-app",
    345   ".zip": "application/x-zip-compressed",
    346 }
    复制代码

    这个是formData.js

    复制代码
      1 // 文件 formData.js
      2 const mimeMap = require('./mimeMap.js')
      3  
      4 function FormData(){
      5   let fileManager = wx.getFileSystemManager();
      6   let data = {};
      7   let files = [];
      8  
      9   this.append = (name, value)=>{
     10     data[name] = value;
     11     return true;
     12   }
     13  
     14   this.appendFile = (name, path, fileName)=>{
     15     let buffer = fileManager.readFileSync(path);
     16     if(Object.prototype.toString.call(buffer).indexOf("ArrayBuffer") < 0){
     17       return false;
     18     }
     19  
     20     if(!fileName){
     21       fileName = getFileNameFromPath(path);
     22     }
     23  
     24     files.push({
     25       name: name,
     26       buffer: buffer,
     27       fileName: fileName
     28     });
     29     return true;
     30   }
     31  
     32   this.getData = ()=>convert(data, files)
     33 }
     34  
     35 function getFileNameFromPath(path){
     36   let idx=path.lastIndexOf("/");
     37   return path.substr(idx+1);
     38 }
     39  
     40 function convert(data, files){
     41   let boundaryKey = 'wxmpFormBoundary' + randString(); // 数据分割符,一般是随机的字符串
     42   let boundary = '--' + boundaryKey;
     43   let endBoundary = boundary + '--';
     44  
     45   let postArray = [];
     46   //拼接参数
     47   if(data && Object.prototype.toString.call(data) == "[object Object]"){
     48     for(let key in data){
     49       postArray = postArray.concat(formDataArray(boundary, key, data[key]));
     50     }
     51   }
     52   //拼接文件
     53   if(files && Object.prototype.toString.call(files) == "[object Array]"){
     54     for(let i in files){
     55       let file = files[i];
     56       postArray = postArray.concat(formDataArray(boundary, file.name, file.buffer, file.fileName));
     57     }
     58   }
     59   //结尾
     60   let endBoundaryArray = [];
     61   endBoundaryArray.push(...endBoundary.toUtf8Bytes());
     62   postArray = postArray.concat(endBoundaryArray);
     63   return {
     64     contentType: 'multipart/form-data; boundary=' + boundaryKey,
     65     buffer: new Uint8Array(postArray).buffer
     66   }
     67 }
     68  
     69 function randString() {
     70   let res = "";
     71   for (let i = 0; i < 17; i++) {
     72     let n = parseInt(Math.random() * 62);
     73     if (n <= 9) {
     74       res += n;
     75     }
     76     else if (n <= 35) {
     77       res += String.fromCharCode(n + 55);
     78     }
     79     else {
     80       res += String.fromCharCode(n + 61);
     81     }
     82   }
     83   return res;
     84 }
     85  
     86 function formDataArray(boundary, name, value, fileName){
     87   let dataString = '';
     88   let isFile = !!fileName;
     89  
     90   dataString += boundary + '\r\n';
     91   dataString += 'Content-Disposition: form-data; name="' + name + '"';
     92   if (isFile){
     93     dataString += '; filename="' + fileName + '"' + '\r\n';
     94     dataString += 'Content-Type: ' + getFileMime(fileName) + '\r\n\r\n';
     95   }
     96   else{
     97     dataString += '\r\n\r\n';
     98     dataString += value;
     99   }
    100  
    101   var dataArray = [];
    102   dataArray.push(...dataString.toUtf8Bytes());
    103  
    104   if (isFile) {
    105     let fileArray = new Uint8Array(value);
    106     dataArray = dataArray.concat(Array.prototype.slice.call(fileArray));
    107   }
    108   dataArray.push(..."\r".toUtf8Bytes());
    109   dataArray.push(..."\n".toUtf8Bytes());
    110  
    111   return dataArray;
    112 }
    113  
    114 function getFileMime(fileName){
    115   let idx = fileName.lastIndexOf(".");
    116   let mime = mimeMap[fileName.substr(idx)];
    117   return mime?mime:"application/octet-stream"
    118 }
    119  
    120 String.prototype.toUtf8Bytes = function(){
    121   var str = this;
    122   var bytes = [];
    123   for (var i = 0; i < str.length; i++) {
    124     bytes.push(...str.utf8CodeAt(i));
    125     if (str.codePointAt(i) > 0xffff) {
    126       i++;
    127     }
    128   }
    129   return bytes;
    130 }
    131  
    132 String.prototype.utf8CodeAt = function(i) {
    133   var str = this;
    134   var out = [], p = 0;
    135   var c = str.charCodeAt(i);
    136   if (c < 128) {
    137     out[p++] = c;
    138   } else if (c < 2048) {
    139     out[p++] = (c >> 6) | 192;
    140     out[p++] = (c & 63) | 128;
    141   } else if (
    142       ((c & 0xFC00) == 0xD800) && (i + 1) < str.length &&
    143       ((str.charCodeAt(i + 1) & 0xFC00) == 0xDC00)) {
    144     // Surrogate Pair
    145     c = 0x10000 + ((c & 0x03FF) << 10) + (str.charCodeAt(++i) & 0x03FF);
    146     out[p++] = (c >> 18) | 240;
    147     out[p++] = ((c >> 12) & 63) | 128;
    148     out[p++] = ((c >> 6) & 63) | 128;
    149     out[p++] = (c & 63) | 128;
    150   } else {
    151     out[p++] = (c >> 12) | 224;
    152     out[p++] = ((c >> 6) & 63) | 128;
    153     out[p++] = (c & 63) | 128;
    154   }
    155   return out;
    156 };
    157  
    158  
    159 module.exports = FormData;
    复制代码

     

  • 相关阅读:
    ChatGPT提示词工程&LLM应用全解
    java 基于springBoot上传文件/文件夹使用实例
    python的类型注释
    java计算机毕业设计学生协会管理系统MyBatis+系统+LW文档+源码+调试部署
    阿里云验证SSL证书
    大数据开发,Hadoop Spark太重?你试试esProc SPL
    ElasticSearch 爬坑记录
    Arthas入门使用
    JDK21更新内容:临时变量
    DirectX12 - Swap Chain(交换链)
  • 原文地址:https://www.cnblogs.com/samllWhite/p/16472258.html