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;
|
|
|