# Files

Telegram supports specifying files in many different formats. In order to
accommodate them all, there are multiple structs and type aliases required.

All of these types implement the `RequestFileData` interface.

| Type         | Description                                                               |
| ------------ | ------------------------------------------------------------------------- |
| `FilePath`   | A local path to a file                                                    |
| `FileID`     | Existing file ID on Telegram's servers                                    |
| `FileURL`    | URL to file, must be served with expected MIME type                       |
| `FileReader` | Use an `io.Reader` to provide a file. Lazily read to save memory.         |
| `FileBytes`  | `[]byte` containing file data. Prefer to use `FileReader` to save memory. |

## `FilePath`

A path to a local file.

```go
file := tgbotapi.FilePath("tests/image.jpg")
```

## `FileID`

An ID previously uploaded to Telegram. IDs may only be reused by the same bot
that received them. Additionally, thumbnail IDs cannot be reused.

```go
file := tgbotapi.FileID("AgACAgIAAxkDAALesF8dCjAAAa_…")
```

## `FileURL`

A URL to an existing resource. It must be served with a correct MIME type to
work as expected.

```go
file := tgbotapi.FileURL("https://i.imgur.com/unQLJIb.jpg")
```

## `FileReader`

Use an `io.Reader` to provide file contents as needed. Requires a filename for
the virtual file.

```go
var reader io.Reader

file := tgbotapi.FileReader{
    Name: "image.jpg",
    Reader: reader,
}
```

## `FileBytes`

Use a `[]byte` to provide file contents. Generally try to avoid this as it
results in high memory usage. Also requires a filename for the virtual file.

```go
var data []byte

file := tgbotapi.FileBytes{
    Name: "image.jpg",
    Bytes: data,
}
```