> For the complete documentation index, see [llms.txt](https://support.whapi.cloud/help-desk/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://support.whapi.cloud/help-desk/sending/send-video-audio-image-document/how-to-send-file-from-your-local-computer-using-the-api.md).

# How to send file from your local computer using the API

We will explain what “Upload from file” means and show how to do it in different programming languages using the multipart/form-data format

Whapi.Cloud supports sending media files (images, documents, audio, etc.) using several methods:

* By [**URL**](/help-desk/sending/send-video-audio-image-document.md#sending-media-by-link)**;**
* By [**Base64**](/help-desk/sending/send-video-audio-image-document.md#sending-media-via-base64)**;**
* By [**media ID**](/help-desk/sending/send-video-audio-image-document.md#sending-media-by-media-id-uploading-file-to-our-cloud) (after a file is uploaded);
* By **directly uploading the file** from your local computer;

This article explains how to use the "Upload from file" option — one of the most commonly misunderstood steps for new developers.

***

One of the most common points of confusion for new developers working with media upload is the **"Upload from File"** option.\
While uploading by URL or Base64 is relatively straightforward, sending a **file from your local machine** using code requires a clear understanding of how multipart/form-data works in HTTP.

#### What Does "Upload from File" Mean?

When using **"Media with upload from file"**, you are expected to send the file **as binary data** (not a path or URL) inside the request body using the `multipart/form-data` format. This is the same method used when uploading files through forms on websites.

> ⚠️ A common mistake is trying to send a local file path or `localhost` URL like:\
> `"media": "http://localhost:8080/files/logo.png"`\
> This **will not work** — the API doesn't know how to access your local system.

Instead, you must **send the actual file content** as part of the HTTP request.&#x20;

{% hint style="info" %}
Sending a media file works via multipart/form-data or via a Base64 string with the appropriate prefix. Both methods are valid. You can choose the one that best suits your development environment.

Read more about [Sending File as Base64](/help-desk/sending/send-video-audio-image-document.md#sending-media-via-base64).
{% endhint %}

### Sending File via multipart/form-data

You can upload the file directly in binary form using `multipart/form-data`.\
This is how file uploads typically work in forms and in Postman.

#### Examples:

{% tabs %}
{% tab title="cURL" %}

```bash
curl -X POST https://gate.whapi.cloud/messages/image \
  -H "Authorization: Bearer {YOUR_TOKEN}" \
  -F 'to=919984351847' \
  -F 'caption=Hello, this message was sent via API!' \
  -F 'media=@/path/to/your/file.png'

```

{% endtab %}

{% tab title="Python" %}

```python
import requests

url = 'https://gate.whapi.cloud/messages/image'
token = 'YOUR_TOKEN'

data = {
    'to': '919984351847',
    'caption': 'Hello, this message was sent via API!'
}

files = {
    'media': open('file.png', 'rb')
}

headers = {
    'Authorization': f'Bearer {token}'
}

response = requests.post(url, data=data, files=files, headers=headers)
print(response.json())

```

**Note:** Python automatically formats the request as `multipart/form-data` when using the `files` parameter.
{% endtab %}

{% tab title="PHP" %}

```php
<?php
$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'https://gate.whapi.cloud/messages/image');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, 1);

$headers = [
    'Authorization: Bearer YOUR_TOKEN'
];

$data = [
    'to' => '919984351847',
    'caption' => 'Hello, this message was sent via API!',
    'media' => new CURLFile('file.png')
];

curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

$response = curl_exec($ch);
curl_close($ch);

echo $response;
?>

```

**Note:** `CURLFile` ensures that the file is sent as multipart/form-data. The API will handle the rest.
{% endtab %}

{% tab title="Node.js" %}

```javascript
const axios = require('axios');
const FormData = require('form-data');
const fs = require('fs');

const form = new FormData();
form.append('to', '919984351847');
form.append('caption', 'Hello, this message was sent via API!');
form.append('media', fs.createReadStream('./file.png'));

axios.post('https://gate.whapi.cloud/messages/image', form, {
  headers: {
    'Authorization': 'Bearer YOUR_TOKEN',
    ...form.getHeaders()
  }
})
.then(response => console.log(response.data))
.catch(error => console.error(error.response?.data || error.message));

```

{% endtab %}
{% endtabs %}
