Pure JavaScript react native library for uploading to AWS S3
npm install @onytgvx/react-native-aws3
npm install --save react-native-aws3
`



Note on S3 user permissions
The user associated with the accessKey and secretKey you use must have the appropriate permissions assigned to them. My user's IAM policy looks like:
`json
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1458840156000",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:GetObjectAcl",
"s3:GetObjectVersion",
"s3:PutObject",
"s3:PutObjectAcl",
"s3:PutObjectVersionAcl"
],
"Resource": [
"arn:aws:s3:::my-bucket/uploads/*"
]
}
]
}
`
Example
`javascript
import { RNS3 } from 'react-native-aws3';
const file = {
// uri can also be a file system path (i.e. file://)
uri: "assets-library://asset/asset.PNG?id=655DBE66-8008-459C-9358-914E1FB532DD&ext=PNG",
name: "image.png",
type: "image/png"
}
const options = {
keyPrefix: "uploads/",
bucket: "your-bucket",
region: "us-east-1",
accessKey: "your-access-key",
secretKey: "your-secret-key",
successActionStatus: 201,
metadata: {
latitude: '123.506239', // Becomes x-amz-meta-latitude onec in S3
longitude: '-23.045293',
photographer: 'John Doe'
}
}
RNS3.put(file, options).then(response => {
if (response.status !== 201)
throw new Error("Failed to upload image to S3");
console.log(response.body);
/**
* {
* postResponse: {
* bucket: "your-bucket",
* etag : "9f620878e06d28774406017480a59fd4",
* key: "uploads/image.png",
* location: "https://your-bucket.s3.amazonaws.com/uploads%2Fimage.png"
* }
* }
*/
});
`
Usage
$3
Upload a file to S3.
Arguments:
1. file
* uri required - File system URI, can be assets library path or file:// path
* name required - The name of the file, will be stored as such in S3
* type required - The mime type, also used for Content-Type parameter in the S3 post policy
2. options
* acl - The Access Control List of this object. Defaults to public-read
* keyPrefix - Prefix, or path to the file on S3, i.e. uploads/ (note the trailing slash)
* bucket required - Your S3 bucket
* region required - The region of your S3 bucket
* accessKey required - Your S3 AWSAccessKeyId
* secretKey required - Your S3 AWSSecretKey
* metadata - Custom metadata to attach to your object
* successActionStatus - HTTP response status if successful, defaults to 201
* awsUrl - AWS S3 url. Defaults to s3.amazonaws.com
* timeDelta - Devices time offset from world clock in milliseconds, defaults to 0
Returns an object that wraps an XMLHttpRequest instance and behaves like a promise, with the following additional methods:
* progress - accepts a callback which will be called with an event representing the progress of the upload. Event object is of shape
* loaded - amount uploaded
* total - total amount to upload
* percent - number between 0 and 1 representing the percent completed
* abort - aborts the xhr instance
Examples:
`javascript
RNS3.put(file, options)
.progress((e) => console.log(e.loaded / e.total)); // or console.log(e.percent)
RNS3.put(file, option)
.abort();
`
TODO
- [ ] Support DeleteObject and (authenticated) GetObject` operations.