新建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-