# File Upload File uploading is very simple. Files are detected and turned into `Amber::Router::File` and put into a temporary file cache. You can access files from the `params` macro using the `files` method. ```crystal params.files ``` This will return a `Hash(String, Amber::Router::File)` object that you can work with. The attributes you can access are: ```crystal file : File filename : String? headers : HTTP::Headers creation_time : Time? modification_time : Time? read_time : Time? size : UInt64? ``` For example, let's say we have a controller with a `create` method that we want someone to `POST` a JSON body that includes a file to upload: ```crystal # header: `accept: audio/mp3` # # POST body # { # "audio_file": // binary data for the audio file # "file_name": "some_file_name.mp3" # } def create uploaded_file = params.files["audio_file"] uploaded_file_name = params["file_name"] # Do whatever you want with the files and your method 😄 end ``` {% hint style="warning" %} First you need an amber project generated with [Amber CLI](../guides/create-new-app.md) or [from scratch](from-scratch.md). {% endhint %} You still require a form to upload your file, see [views](../guides/views/). Also see [request and response](../guides/controllers/request-and-response-objects.md).