taro使用formData。

之前写过一个文章Taro微信小程序没有FromData_夏天想的博客-CSDN博客

今天发现还有另一个方法

mimeMap.ts

export default {
  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',
};

form-data.ts

import mimeMap from './mimeMap'
import taro from '@tarojs/taro'
function FormData() {
  let fileManager = taro.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;
};

export default FormData;

然后使用index.vue

import FormData from '@/utils/form-data'
let formData = new FormData();

formData.append('from', form.channel);
formData.append('order_id', form.order_id);
formData.append('order_type', form.order_type);
formData.append('phone', form.phone);
formData.append('vip_type', form.vip_type);
let data = formData.getData();

然后就可以正常的传值接口调用啦

猜你喜欢

转载自blog.csdn.net/qq_33769914/article/details/128937986
今日推荐