# UploadIO

Simple middleware for uploading files.

# Install
```
# With NPM 
npm install uploadio

# With Yarn 
yarn add uploadio
```

# Usage

When you upload a file, the file will be accessible from req.files.

Example:

You're uploading a file called xxx.jpg

Your input's name field is profileImage: <input name="profileImage" type="file" />

In your server request, you can access your uploaded file from req.files.profileImage:

```
router.post('/', function(req, res) {
  res.send({files: req.files.profileImage});
});
```

# Using middleware

```
app.use(fileUpload({
  debug: true,
  thumbnails: [{
    width: 250,
    height: 250,
    fit: [cover, contain, fill, inside or outside] // option, default cover
  }, {
    width: 50,
    height: 50,
  }],
  persistFileName: true,
  uploadDir: 'uploads/profiles', //Don't add forward slash at the end of path
  saveToS3: {
    secretAccessKey: 'YOUR-AWS-SECRET-KEY',
    accessKeyId: ''YOUR-AWS-ACCESS-KEY',
    bucket: 'BUCKET-NAME'
  }
}));

// How to get the the uploaded files for further use?
// req.cloudFiles ✓
app.post('/upload', function(req, res, next) {
    console.info(req.cloudFiles);
})
```

# Sample output

## Uploaded to local disk
```
{
    "files": [
        {
            "location": "uploads/profiles/download.jpeg",
            "key": "download.jpeg",
            "thumbnailImageUrls": [
                {
                    "250x250": "uploads/profiles/download_250x250.jpeg"
                },
                {
                    "50x50": "uploads/profiles/download_50x50.jpeg"
                }
            ]
        },
        {
            "location": "uploads/profiles/men.png",
            "key": "men.png",
            "thumbnailImageUrls": [
                {
                    "250x250": "uploads/profiles/men_250x250.png"
                },
                {
                    "50x50": "uploads/profiles/men_50x50.png"
                }
            ]
        }
    ]
}
```

## When uploaded to s3

```
{
    "files": [
        {
            "location": "https://xxx.s3.amazonaws.com/uploads/profiles/download.jpeg",
            "key": "uploads/profiles/download.jpeg",
            "thumbnailImageUrls": [
                {
                    "250x250": "https://xxx.s3.amazonaws.com/uploads/profiles/download_250x250.jpeg"
                },
                {
                    "50x50": "https://xxx.s3.amazonaws.com/uploads/profiles/download_50x50.jpeg"
                }
            ]
        },
        {
            "location": "https://xxx.s3.amazonaws.com/uploads/profiles/men.png",
            "key": "uploads/profiles/men.png",
            "thumbnailImageUrls": [
                {
                    "250x250": "https://xxx.s3.amazonaws.com/uploads/profiles/men_250x250.png"
                },
                {
                    "50x50": "https://xxx.s3.amazonaws.com/uploads/profiles/men_50x50.png"
                }
            ]
        }
    ]
}
```

# APIs

| Name | Default | Usage |
| ------ | ------ |------|
| debug | false or true | debug option to true to see some logging about upload process |
| thumbnails | empty or [] | Should be an array of desired height and width |
| persistFileName | false or true | Random file name ex: 123456789.jpeg, if true actual file name separated by underscore for spaces |
| uploadDir | optional | If provided created directories otherwise uploaded at the root in a director `uploads` |
| saveToS3 | optional | If passed the resources will be uploaded to s3. You need to provide secretAccessKey, accessKeyId and bucket name|
| keepExtension | optional | If passed then file extension will be passed value |
| thumbnails: [{width, height, fit}] | how the image should be resized to fit both provided dimensions, one of cover, contain, fill, inside or outside. (optional, default 'cover') | |
| thumbnail option | | REF. https://sharp.pixelplumbing.com/api-resize |

# Thanks & Credit
 [Busboy Package](https://github.com/mscdex/busboy)
 [AWS SDK Package](httpshttps://github.com/aws/aws-sdk-js)
 [Image thumbnail](https://github.com/onildoaguiar/image-thumbnail)