(url: string, fields: Record<string, string>, fileFieldName: string, fileBuffer: ArrayBuffer, filename: string, headers: Record<string, string> = {})
| 69 | } |
| 70 | |
| 71 | function multipartFetch(url: string, fields: Record<string, string>, fileFieldName: string, fileBuffer: ArrayBuffer, filename: string, headers: Record<string, string> = {}): Promise<Response> { |
| 72 | const boundary = `----BigFileUpload${Date.now().toString(16)}${Math.random().toString(16).slice(2)}`; |
| 73 | const encoder = new TextEncoder(); |
| 74 | const safeName = filename.replace(/[\r\n"]/g, "_"); |
| 75 | let head = ""; |
| 76 | for (const [name, value] of Object.entries(fields)) { |
| 77 | head += `--${boundary}\r\nContent-Disposition: form-data; name="${name}"\r\n\r\n${value}\r\n`; |
| 78 | } |
| 79 | head += `--${boundary}\r\nContent-Disposition: form-data; name="${fileFieldName}"; filename="${safeName}"\r\nContent-Type: application/octet-stream\r\n\r\n`; |
| 80 | const parts = [encoder.encode(head), new Uint8Array(fileBuffer), encoder.encode(`\r\n--${boundary}--\r\n`)]; |
| 81 | return streamFetch(url, "POST", headers, parts, `multipart/form-data; boundary=${boundary}`); |
| 82 | } |
| 83 | |
| 84 | function rawFetch(url: string, method: string, fileBuffer: ArrayBuffer, headers: Record<string, string> = {}): Promise<Response> { |
| 85 | return streamFetch(url, method, headers, [new Uint8Array(fileBuffer)]); |
no test coverage detected