【uniapp微信小程序】自定义使用FormData文件上传

新建formdata.js

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, fileName) => {
   
    let buffer = fileManager.readFileSync(path);
    if (Object.prototype.toString.call(buffer).indexOf("ArrayBuffer") < 0) {
   
      return false;
    }
    if (!fileName) {
   
      fileName = getFileNameFromPath(path);
    }
    files.push({
   
      name: name,
      buffer: buffer,
      fileName: fileName,
    });
    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 = [];
  endBoundaryArray.push(...endBoundary.toUtf8Bytes());
  postArray = postArray.concat(endBoundaryArray);
  return {
   
    contentType: "multipart/form-data; boundary=" + boundaryKey,
    buffer: new Uint8Array(postArray).buffer,
  };
}
function randString() {
   
  var result = "";
  var chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  for (var i = 17; i > 0; --i)
    result += chars[Math.floor(Math.random() * chars.length)];
  return result;
}
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 = [];
  dataArray.push(...dataString.toUtf8Bytes());
  if (isFile) {
   
    let fileArray = new Uint8Array(value);
    dataArray = dataArray.concat(Array.prototype.slice.call(fileArray));
  }
  dataArray.push(..."\r".toUtf8Bytes());
  dataArray.push(..."\n".toUtf8Bytes());
  return dataArray;
}
function getFileMime(fileName) {
   
  let idx = fileName.lastIndexOf(".");
  let mime = mimeMap[fileName.substr(idx)];
  return mime ? mime : "application/octet-
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

★雨 潇★

谢谢您的鼓励,我会继续努力的~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值