You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
39 lines
1.3 KiB
39 lines
1.3 KiB
/*! formdata-polyfill. MIT License. Jimmy Wärting <https://jimmy.warting.se/opensource> */ |
|
|
|
const escape = (str, filename) => |
|
(filename ? str : str.replace(/\r?\n|\r/g, '\r\n')) |
|
.replace(/\n/g, '%0A') |
|
.replace(/\r/g, '%0D') |
|
.replace(/"/g, '%22') |
|
|
|
/** |
|
* pure function to convert any formData instance to a Blob |
|
* instances synchronous without reading all of the files |
|
* |
|
* @param {FormData|*} formData an instance of a formData Class |
|
* @param {Blob|*} [BlobClass=Blob] the Blob class to use when constructing it |
|
*/ |
|
export function formDataToBlob (formData, BlobClass = Blob) { |
|
const boundary = ('----formdata-polyfill-' + Math.random()) |
|
const chunks = [] |
|
const prefix = `--${boundary}\r\nContent-Disposition: form-data; name="` |
|
|
|
for (let [name, value] of formData) { |
|
if (typeof value === 'string') { |
|
chunks.push(prefix + escape(name) + `"\r\n\r\n${value.replace(/\r(?!\n)|(?<!\r)\n/g, '\r\n')}\r\n`) |
|
} else { |
|
chunks.push( |
|
prefix + escape(name) + `"; filename="${escape(value.name, 1)}"\r\n` + |
|
`Content-Type: ${value.type || 'application/octet-stream'}\r\n\r\n`, |
|
value, |
|
'\r\n' |
|
) |
|
} |
|
} |
|
|
|
chunks.push(`--${boundary}--`) |
|
|
|
return new BlobClass(chunks, { |
|
type: 'multipart/form-data; boundary=' + boundary |
|
}) |
|
}
|
|
|