{"id":26796188,"url":"https://github.com/akanass/rx-file-upload","last_synced_at":"2025-07-27T12:07:53.716Z","repository":{"id":57095917,"uuid":"365762973","full_name":"akanass/rx-file-upload","owner":"akanass","description":"Library to upload a file in the browser and send it fully or in several chunks to the server.","archived":false,"fork":false,"pushed_at":"2021-10-11T11:14:45.000Z","size":220,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-26T00:04:29.980Z","etag":null,"topics":["ajax","browser","checksum","chunked-uploads","chunks","file-upload","formdata","multipart-formdata","multipart-uploads","rxjs-observables","rxjs7","stream","xmlhttprequest"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/akanass.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-05-09T13:44:53.000Z","updated_at":"2024-06-12T12:24:32.000Z","dependencies_parsed_at":"2022-08-22T21:40:40.118Z","dependency_job_id":null,"html_url":"https://github.com/akanass/rx-file-upload","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/akanass/rx-file-upload","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akanass%2Frx-file-upload","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akanass%2Frx-file-upload/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akanass%2Frx-file-upload/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akanass%2Frx-file-upload/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/akanass","download_url":"https://codeload.github.com/akanass/rx-file-upload/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akanass%2Frx-file-upload/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267355143,"owners_count":24073916,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-27T02:00:11.917Z","response_time":82,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ajax","browser","checksum","chunked-uploads","chunks","file-upload","formdata","multipart-formdata","multipart-uploads","rxjs-observables","rxjs7","stream","xmlhttprequest"],"created_at":"2025-03-29T18:17:44.281Z","updated_at":"2025-07-27T12:07:53.668Z","avatar_url":"https://github.com/akanass.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Rx-File-Upload\n\n![npm type definitions](https://img.shields.io/npm/types/typescript?style=for-the-badge)\n![npm (scoped)](https://img.shields.io/npm/v/@akanass/rx-file-upload?logo=npm\u0026style=for-the-badge\u0026color=red)\n![Browser Support](https://img.shields.io/badge/Browser-ES5+-brightgreen?style=for-the-badge)\n\nLibrary to upload a file in the browser and send it fully or in several chunks to the server.\n\nAll the implementation is done in [Typescript](https://www.typescriptlang.org/) and is based on the latest version of [RxJS](https://rxjs.dev/).\n\nThis library can only be used in browsers because its functionalities are based on specific elements such as [FormData](https://developer.mozilla.org/fr/docs/Web/API/FormData) and [XMLHttpRequest](https://developer.mozilla.org/fr/docs/Web/API/XMLHttpRequest).\n\nHowever, we provide a [method](#supportsrxfileupload) that will allow you to **easily verify** if you are in a **compatible environment** before performing your treatments. This can be very useful in the case of components rendered on the server side (SSR).\n\n## Table of contents\n\n* [Installation](#installation)\n    * [UMD](#umd)\n* [Usage](#usage)\n* [API in Details](#api-in-details)\n  * [rxFileUpload(config)](#rxfileuploadconfig)\n  * [.progress$](#progress)\n  * [.upload\\\u003cT\\\u003e(oneFileOrMultipleFiles[,additionalFormData])](#uploadtonefileormultiplefilesadditionalformdata)\n    * [Data sent in the FormData](#data-sent-in-the-formdata)\n  * [supportsRxFileUpload()](#supportsrxfileupload)\n* [Types in Details](#types-in-details)\n  * [RxFileUpload](#rxfileupload)\n  * [RxFileUploadConfig](#rxfileuploadconfig-1)\n  * [RxFileUploadAdditionalFormData](#rxfileuploadadditionalformdata)\n  * [RxFileUploadProgressData](#rxfileuploadprogressdata)\n  * [RxFileUploadResponse\\\u003cT\\\u003e](#rxfileuploadresponset)\n  * [RxFileUploadError](#rxfileuploaderror)\n* [License](#license)\n\n## Installation\n\nThis package is available on **npm**:\n\n```bash\n$\u003e npm install @akanass/rx-file-upload rxjs\n\nor \n\n$\u003e yarn add @akanass/rx-file-upload rxjs\n```\n\n### UMD\n\nThis package can also be installed via **unpkg** by including the following script in your page's `\u003chead\u003e` element. The library's methods will be available on the global **`RxFileUploadUnPkg`** object.\n\n```html\n\u003cscript src=\"https://unpkg.com/@akanass/rx-file-upload\"\u003e\u003c/script\u003e\n```\n\n[back to top](#table-of-contents)\n\n## Usage\n\nYou must first have an HTML file containing an [input of type file](https://developer.mozilla.org/fr/docs/Web/HTML/Element/Input/file).\n\nIn our example, we will allow the selection of several `PDF` type files or any `image`:\n\n```html\n\u003cinput id=\"input-file\" type=\"file\" accept=\"application/pdf,image/*\" multiple /\u003e\n```\n\nThen, in your **Typescript** file, you can use the library like this:\n\n```ts\n// import library elements\nimport { rxFileUpload, RxFileUpload, RxFileUploadError, RxFileUploadProgressData, RxFileUploadResponse } from '@akanass/rx-file-upload';\nimport { Subscription } from 'rxjs';\n\n// create variables to store rxjs subscriptions\nlet progressSubscription: Subscription;\nlet uploadSubscription: Subscription;\n\n// get HTML element\nconst inputFile: HTMLInputElement = document.querySelector(\n  '#input-file',\n);\n\n// set listener to clean previous files selection\ninputFile.addEventListener(\n  'click',\n  (e: Event) =\u003e (e.target['value'] = null),\n);\n\n// set listener to upload files\ninputFile.addEventListener('change', (e: Event) =\u003e {\n  // get file list\n  const fileList: FileList = e.target['files'];\n\n  // build files array\n  const files: Files[] = Array.from(\n    { length: fileList.length },\n    (_, idx: number) =\u003e idx++,\n  ).map((i: number) =\u003e fileList.item(i));\n\n  // delete previous subscriptions to memory free\n  if (!!uploadSubscription) {\n    uploadSubscription.unsubscribe();\n  }\n  if (!!progressSubscription) {\n    progressSubscription.unsubscribe();\n  }\n\n  // create new instance of RxFileUpload\n  const manager: RxFileUpload = rxFileUpload({\n    url: 'http://my_api.com/upload'\n  });\n\n  // listen on progress to update UI\n  progressSubscription = manager.progress$.subscribe({\n    next: (_: RxFileUploadProgressData) =\u003e {\n      // log progress data in the console\n      console.log(_);\n      // do some UI update based on progress data \n      // updateProgressUI(_);\n    },\n    complete: () =\u003e console.log('PROGRESS ALL FILES COMPLETED'),\n  });\n\n  // upload file\n  uploadSubscription = manager\n    .upload\u003cany\u003e(files)\n    .subscribe({\n      next: (_: RxFileUploadResponse\u003cany\u003e) =\u003e {\n        // log server answer in the console\n        console.log(_);\n        // do some UI update based on server data \n        // updateUI(_);\n      },\n      error: (e: RxFileUploadError | Error) =\u003e {\n        // display error in the console\n        console.error(e);\n        // do some UI update based on error data \n        // updateUIWithError(e);\n      },\n      complete: () =\u003e console.log('UPLOAD ALL FILES COMPLETED'),\n    });\n});\n```\n\nYou just have to **compile** your file and insert it in a `script` tag of your **HTML** and you're done.\n\nOf course, you can use **JavaScript** language to create your script file but in this case the **types** will not be available as in the previous example and you will just have to import the method allowing to create the instance of the library.\n\n```ts\nimport { rxFileUpload } from '@akanass/rx-file-upload';\n```\n\nTo have a real implementation and test of this library, go to this [project](https://github.com/akanass/upload-file-with-chunks).\n\n[back to top](#table-of-contents)\n\n## API in Details\n\n### `rxFileUpload(config)`\n\nCreate a new instance of `RxFileUpload`. An error will be thrown if you aren't in a `browser` environment.\n\n**Parameter:**\n\u003e ***{[RxFileUploadConfig](#rxfileuploadconfig-1)} config**: object with only `url` member required.*\n\n**Return:**\n\u003e ***{[RxFileUpload](#rxfileupload)}** new instance of `RxFileUpload` with the given configuration.*\n\n**Example:**\n```ts\nimport { rxFileUpload, RxFileUpload } from '@akanass/rx-file-upload';\n\n// create new instance of RxFileUpload\nconst manager: RxFileUpload = rxFileUpload({\n  url: 'http://my_api.com/upload'\n});\n```\n\n[back to top](#table-of-contents)\n\n### `.progress$`\n\nProgress `Observable` which streams progress data for each file(s)/chunk(s) uploaded.\n\n**Return:**\n\u003e ***{Observable\\\u003c[RxFileUploadProgressData](#rxfileuploadprogressdata)\\\u003e}** the `Observable` which streams progress data `RxFileUploadProgressData` for each file(s)/chunk(s) uploaded.*\n \n**Example:**\n```ts\nimport { rxFileUpload, RxFileUpload, RxFileUploadProgressData } from '@akanass/rx-file-upload';\n\n// create new instance of RxFileUpload\nconst manager: RxFileUpload = rxFileUpload({\n  url: 'http://my_api.com/upload'\n});\n\n// subscribe to progress stream\nmanager.progress$.subscribe({\n  next: (_: RxFileUploadProgressData) =\u003e {\n    // log progress data in the console\n    console.log(_);\n    // do some UI update based on progress data \n    // updateProgressUI(_);\n  },\n  complete: () =\u003e console.log('PROGRESS ALL FILES COMPLETED'),\n});\n```\n\n[back to top](#table-of-contents)\n\n### `.upload\u003cT\u003e(oneFileOrMultipleFiles[,additionalFormData])`\n\nFunction to upload **one** or **multiple** files, with or without chunks, to the server with **optional** additional data and returns the `Observable` which streams the response from the server after each file has been uploaded.\n\n\u003e NOTES:\n\u003e \n\u003e This function will do a `POST` request to the server by default. Only `POST` and `PUT` requests are allowed. See [RxFileUploadConfig](#rxfileuploadconfig-1) to change the `method`.\n\u003e \n\u003e For each uploaded file, a **unique** identifier will be inserted in the `X-RxFileUpload-ID` **header** and in the `rxFileUploadId` attribute of the [FormData](#data-sent-in-the-formdata) in order to be able to trace the transaction.\n\u003e This **unique** value will be present in **all new requests** and will be, of course, the **same** when sending the file in several **chunks**.\n\u003e You can therefore associate them easily with their main file without having to look at the additional data inserted in the [FormData](#data-sent-in-the-formdata).\n\n**Parameters:**\n\u003e ***{File | File[]} oneFileOrMultipleFiles** (required): the file(s) to upload to the server.*\n\u003e \n\u003e ***{[RxFileUploadAdditionalFormData](#rxfileuploadadditionalformdata)} additionalFormData** (optional): object representing additional data added in the `FormData` before sending to the server.*\n\n**Return:**\n\u003e ***{Observable\\\u003c[RxFileUploadResponse\\\u003cT\\\u003e](#rxfileuploadresponset)\\\u003e}** the `Observable` which streams the response `RxFileUploadResponse\u003cT\u003e`, from the server, after each file has been uploaded. `\u003cT\u003e` is a generic value that corresponds to the type of the response sent by the server.*\n\n**Example:**\n```ts\nimport { rxFileUpload, RxFileUpload, RxFileUploadResponse, RxFileUploadError } from '@akanass/rx-file-upload';\n\n// create new instance of RxFileUpload\nconst manager: RxFileUpload = rxFileUpload({\n  url: 'http://my_api.com/upload'\n});\n\n// subscribe to upload stream\nmanager.upload\u003cany\u003e(files)\n  .subscribe({\n    next: (_: RxFileUploadResponse\u003cany\u003e) =\u003e {\n      // log server answer in the console\n      console.log(_);\n      // do some UI update based on server data \n      // updateUI(_);\n    },\n    error: (e: RxFileUploadError | Error) =\u003e {\n      // display error in the console\n      console.error(e);\n      // do some UI update based on error data \n      // updateUIWithError(e);\n    },\n    complete: () =\u003e console.log('UPLOAD ALL FILES COMPLETED'),\n});\n```\n\n#### Data sent in the FormData\n\nThe data sent to the server will be included in a `FormData` object of which here are the details:\n\n```ts\n// data object built and inserted in a FormData object\nconst data: any = {\n  rxFileUploadId: [string], // unique identifier used to identify a transaction. This value is the same as in the `X-RxFileUpload-ID` header.\n  fileData: {\n    name: [File.name], // name property of the current file to upload\n    size: [File.size], // size property of the current file to upload\n    lastModified: [File.lastModified], // lastModified property of the current file to upload\n    type: [File.type], // type property of the current file to upload\n    sha256Checksum?: [checksum] // generated only if config.addChecksum === true\n  },\n  [additionalFormData.fieldName]?: [additionalFormData.data], // generated only if `additionalFormData` object is passed in parameter of the upload method\n  chunkData?: { // generated only if config.useChunks === true\n    name: [`${File.name}.part${chunkData.sequence}`], // name property of the current chunk to upload which is the current `File.name` suffixed by `.partX` with `X` the value of the current sequence \n    size: [chunkData.endByte - chunkData.startByte], // size property of the current chunk to upload which is a helper to avoid the calculation of `endByte - startByte`\n    lastModified: [File.lastModified], // lastModified property of the current chunk to upload which is the same than the file itself\n    type: 'application/octet-stream', // type property of the current chunk to upload which is only a binary part of the full file\n    sequence: [number], // the current chunk number\n    totalChunks: [number], // the total number of chunks\n    startByte: [number], // the start byte number of the chunk\n    endByte: [number] // the end byte number of the chunk\n  },\n  file: [File], // the file object to upload which is the binary data. For a file upload, it's the file itself and for chunks upload, it's a new instance of the File object for each individual chunk: `new File([File.slice(chunkData.startByte, chunkData.endByte)], chunkData.name, {type: chunkData.type, lastModified: chunkData.lastModified})`\n};\n\n// FormData instance\nconst formData = new FormData();\n\nformData.append('rxFileUploadId', data.rxFileUploadId);\nformData.append('fileData', JSON.stringify(data.fileData));\nformData.append('[additionalFormData.fieldName]', JSON.stringify(data['[additionalFormData.fieldName]'])); // optional\nformData.append('chunkData', JSON.stringify(data.chunkData)); // optional\nformData.append('file', data.file);\n```\n\n[back to top](#table-of-contents)\n\n### `supportsRxFileUpload()`\n\nMethod that will allow you to **easily verify** if you are in a **compatible environment** before performing your treatments.\n\nThis can be very useful in the case of components rendered on the server side (SSR).\n\nThis method is called when you instantiate `RxFileUpload` and **throw an error** if you can't use the library.\n\n**Return:**\n\u003e ***{boolean}** the flag to know if we can use `RxFileUpload` library.*\n\n**Example:**\n```ts\nimport { supportsRxFileUpload } from '@akanass/rx-file-upload';\n\n// check if the library is supported\nif (!!supportsRxFileUpload()) {\n  // then do your stuff\n}\n```\n\n[back to top](#table-of-contents)\n\n## Types in Details\n\n### *RxFileUpload:*\n\nRepresents the instance of the object to upload file to the server. This is the **main** type of the library.\n\n\u003e - ***{Observable\\\u003c[RxFileUploadProgressData](#rxfileuploadprogressdata)\\\u003e} .progress$**: the `Observable` which streams progress data `RxFileUploadProgressData` for each file(s)/chunk(s) uploaded.*\n\u003e \n\u003e - ***{Observable\u003c[RxFileUploadResponse\\\u003cT\\\u003e](#rxfileuploadresponset)\u003e} .upload\\\u003cT\\\u003e(oneFileOrMultipleFiles: File | File[], additionalFormData?: [RxFileUploadAdditionalFormData](#rxfileuploadadditionalformdata))**: the function to upload file to the server and returns the `Observable` which streams the response `RxFileUploadResponse\u003cT\u003e`, from the server, after each file has been uploaded.*\n\n### *RxFileUploadConfig:*\n\nRepresents the object to configure a new instance of [`RxFileUpload`](#rxfileuploadconfig-1) with the [`rxFileUpload(config)`](#rxfileuploadconfig) method.\n\n\u003e - ***{string} url** (required): The address of the resource to request via HTTP. An error will be thrown if you don't provide it.*\n\u003e \n\u003e - ***{string} method** (optional): The HTTP Method to use for the request. Only `POST` and `PUT` are allowed. (default: `POST`).*\n\u003e \n\u003e - ***{Readonly\\\u003cRecord\\\u003cstring, any\\\u003e\\\u003e} headers** (optional): The HTTP headers to apply. **NOTE**: `Content-Type` header must not be included because it will be automatically added by the library with the good value.*\n\u003e \n\u003e - ***{number} timeout** (optional): The time to wait before causing the underlying `XMLHttpRequest` to timeout. (default: `0`, which is idiomatic for `never timeout`).*\n\u003e \n\u003e - ***{string} user** (optional): The user credentials username to send with the HTTP request. (default: `undefined`).*\n\u003e \n\u003e - ***{string} password** (optional): The user credentials password to send with the HTTP request. (default: `undefined`).*\n\u003e \n\u003e - ***{boolean} crossDomain** (optional): Whether to send the HTTP request as a CORS request. (default: `false`).*\n\u003e \n\u003e - ***{boolean} withCredentials** (optional): To send user credentials in a CORS request, set to `true`. To exclude user credentials from a CORS request, OR when cookies are to be ignored by the CORS response, set to `false`. (default: `false`).*\n\u003e \n\u003e - ***{string} xsrfCookieName** (optional): The name of your site's `XSRF` cookie. (default: `undefined`).*\n\u003e \n\u003e - ***{string} xsrfHeaderName** (optional): The name of a custom header that you can use to send your `XSRF` cookie. (default: `undefined`).*\n\u003e \n\u003e - ***{XMLHttpRequestResponseType} responseType** (optional): Can be set to change the response type. Valid values are `\"arraybuffer\"`, `\"blob\"`, `\"document\"`, `\"json\"`, and `\"text\"`. Note that the type of `\"document\"` (such as an XML document) is ignored if the global context is not `Window`. (default: `\"json\"`).*\n\u003e \n\u003e - ***{string | URLSearchParams | Record\\\u003cstring, string | number | boolean | string[] | number[] | boolean[]\\\u003e | [string, string | number | boolean | string[] | number[] | boolean[]][]} queryParams** (optional): Query string parameters to add to the URL in the request. (This will require a polyfill for URL and URLSearchParams in Internet Explorer!). Accepts either a query string, a `URLSearchParams` object, a dictionary of key/value pairs, or an array of key/value entry tuples. (Essentially, it takes anything that new `URLSearchParams` would normally take). If, for some reason you have a query string in the url argument, this will append to the query string in the url, but it will also overwrite the value of any keys that are an exact match. In other words, an url of `/test?a=1\u0026b=2`, with queryParams of `{ b: 5, c: 6 }` will result in a url of roughly `/test?a=1\u0026b=5\u0026c=6`. (default: `undefined`).*\n\u003e \n\u003e - ***{boolean} useChunks** (optional): The flag to indicate if the file(s) should be split into several chunks before sending to the server and not sending the full file. (default: `false`).*\n\u003e \n\u003e - ***{number} chunkSize** (optional): The size in `bytes` of a chunk. The size of a chunk must be a multiple of `1024` bytes (1 Kb) else an error will be thrown when the library is instantiated. (default: `1048576` (1 Mb)).*\n\u003e \n\u003e - ***{boolean} addChecksum** (optional): The flag to indicate if the file(s) `sha256 checksum` should be calculated before sending to the server. However, you should know that the larger the file, the longer the generation time will be, which will cause a delay before sending it to the server. (default: `false`).*\n\u003e\n\u003e - ***{boolean} disableProgressCompletion** (optional): The flag to indicate if the [`.progress$`](#progress) Observable completion will be disabled at the end of the upload process. If you want to keep the same instance of [`RxFileUpload`](#rxfileupload) and use the [`.upload\u003cT\u003e(oneFileOrMultipleFiles[,additionalFormData])`](#uploadtonefileormultiplefilesadditionalformdata) method several times without having to subscribe again to the [`.progress$`](#progress) Observable, you must therefore deactivate its completion. (default: `false`).*\n\n### *RxFileUploadAdditionalFormData:*\n\nRepresents the object to add additional data inside the `FormData` before sending the file(s) to the server with the [`.upload\u003cT\u003e(oneFileOrMultipleFiles[,additionalFormData])`](#uploadtonefileormultiplefilesadditionalformdata) method.\n\n\u003e - ***{string} fieldName** (required): The key of the `FormData` key/pair data - `Read-Only`.*\n\u003e \n\u003e - ***{string | object} data** (required): The value of the `FormData` key/pair data - `Read-Only`. This value will be automatically serialized, if it's an object, with a `JSON.stringify()`.*\n\n### *RxFileUploadProgressData:*\n\nRepresents the object sent by the progress `Observable` when subscribing to the [`.progress$`](#progress) attribute.\n\n\u003e - ***{number} progress** (required): The current progress value for the upload of a file - `Read-Only`. It does not matter if the file is sent totally or in chunks, the value of progress will be calculated according to the type of send.*\n\u003e \n\u003e - ***{number} fileIndex** (optional): The file index in the array of files for a multiple files upload - `Read-Only`. (default: `undefined`).*\n\n### *RxFileUploadResponse\\\u003cT\\\u003e:*\n\nRepresents the response, from the server, streamed by the `Observable`, after each file has been uploaded, when subscribing to the [`.upload\u003cT\u003e(oneFileOrMultipleFiles[,additionalFormData])`](#uploadtonefileormultiplefilesadditionalformdata) method. `\u003cT\u003e` is a generic value that corresponds to the type of the response sent by the server.\n\n\u003e - ***{number} status** (required): The HTTP status code - `Read-Only`.*\n\u003e \n\u003e - ***{T} response** (required): The response data, if any. Note that this will automatically be converted to the proper type - `Read-Only`.*\n\u003e \n\u003e - ***{Record\\\u003cstring, string\\\u003e} responseHeaders** (required): A dictionary of the response headers - `Read-Only`.*\n\u003e \n\u003e - ***{number} fileIndex** (optional): The file index in the array of files for a multiple files upload - `Read-Only`. (default: `undefined`).*\n\n### *RxFileUploadError:*\n\nRepresents the error response, from the server, streamed by the `Observable`, during each file upload, when subscribing to the [`.upload\u003cT\u003e(oneFileOrMultipleFiles[,additionalFormData])`](#uploadtonefileormultiplefilesadditionalformdata) method.\n\n\u003e - ***{number} status** (required): The HTTP status code, if the request has completed. If not, it is set to `0`.*\n\u003e \n\u003e - ***{any} response** (required): The error response data.*\n\n[back to top](#table-of-contents)\n\n## License\n\nThis library is [MIT licensed](LICENSE.md).\n\n[back to top](#table-of-contents)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakanass%2Frx-file-upload","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fakanass%2Frx-file-upload","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakanass%2Frx-file-upload/lists"}