A streamlined Node.js library for effortless integration and management of Cloudflare R2 Object Storage, simplifying cloud storage operations in your projects.
To install the library, use npm:
npm install cloudflare-r2-sdk
Languages: English
current | ไทย
coming soon
Declare the Client
const R2Client = require('cloudflare-r2-sdk');
const objectStorageClient = new R2Client(
ACCOUNT_ID, // Your ACCOUNT_ID from Cloudflare R2 Dashboard
ACCESS_KEY_ID, // Your Access Key from Cloudflare R2 API
SECRET_ACCESS_KEY // Your Secret Key from Cloudflare R2 API
);
Upload the image object to bucket
const uploadResponse = await bucket.put(
bucketName: 'your-bucket-name',
keyName: 'img/image.jpg',
fileBuffer: buffer,
contentType: 'image/jpeg'
);
console.log(uploadResponse);
Reponse
{
"data": {
"success": true,
"statusCode": 200,
"expire": 604800, // in ms default is 7 days
"bucket": "company",
"keyname": "img/image.jpg", // your path EX. user/john/profile-icon.png = https://bucketurl/user/john/profile-icon.jpg
"url": "https://company.7492760310487df2252ef9441759c9a0.r2.cloudflarestorage.com/img/image.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=f525dac59ab797357113dcf3dedbdbca%2F20240709%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20240709T030506Z&X-Amz-Expires=604800&X-Amz-Signature=a15aaa3fb8162eb285e8d7eabf99253adee28dc22945c867e9c0cca959388936&X-Amz-SignedHeaders=host&x-id=GetObject", // temp url
"permanentURL": null, // Will appears when after you set a Custom Public Domain
"message": "Generated signed URL for object"
},
"status": 200,
"message": "Object has been uploaded successfully"
}
Get an Object URL
const objectURL = await objectStorageClient.getObjectURL({
bucketName: BUCKET_NAME,
keyName: 'img/image.jpg', // path inside bucket
expiresIn: 30 // Expires in MS
});
console.log(objectURL);
Response
{
"success": true,
"statusCode": 200,
"expire": 30,
"bucket": "company",
"keyname": "img/image.jpg", // path inside bucket
"url": "https://company.7492760310487df2252ef9441759c9a0.r2.cloudflarestorage.com/img/image.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=f525dac59ab797357113dcf3dedbdbca%2F20240709%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20240709T024330Z&X-Amz-Expires=30&X-Amz-Signature=e4675c9df9e2c7a32989254f87e2cabe006dc057f291a4c231c788d51c10bc29&X-Amz-SignedHeaders=host&x-id=GetObject", // temp url
"permanentURL": null, // Will appears when after you set a Custom Public Domain
"message": "Generated signed URL for object"
}
Set a Custom Public Domain
objectStorageClient.setPublicDomain('https://r2.yourdomain.com');
Get an Object URL with Custom Domain
const objectURL = await objectStorageClient.getObjectURL({
bucketName: BUCKET_NAME,
keyName: 'img/image.jpg', // path inside bucket
expiresIn: 30 // Expires in MS
});
console.log(objectURL);
Response with Custom Domain
{
"success": true,
"statusCode": 200,
"expire": 30,
"bucket": "company",
"keyname": "img/image.jpg", // path inside bucket
"url": "https://company.7492760310487df2252ef9441759c9a0.r2.cloudflarestorage.com/img/image.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Content-Sha256=UNSIGNED-PAYLOAD&X-Amz-Credential=f525dac59ab797357113dcf3dedbdbca%2F20240709%2Fauto%2Fs3%2Faws4_request&X-Amz-Date=20240709T024330Z&X-Amz-Expires=30&X-Amz-Signature=e4675c9df9e2c7a32989254f87e2cabe006dc057f291a4c231c788d51c10bc29&X-Amz-SignedHeaders=host&x-id=GetObject",
"permanentURL": "https://r2.yourdomain.com/img/image.jpg", // <--- Your permanent URL
"message": "Generated signed URL for object"
}
Check for latency
const latency = await objectStorageClient.ping();
console.log(latency);
Response the latency
{ "success": true, "latency": 377, "message": "Ping successful" }
Delete an object from the bucket
const deleteResponse = await objectStorageClient.deleteObject(
bucketName: 'your-bucket-name',
keyName: 'company-video.mp4' // path inside bucket
);
console.log(deleteResponse);
Reponse
{
"success": true,
"message": "Object has been deleted",
"statusCode": 204,
"attempts": 1,
"totalRetryDelay": 0,
"requestId": null,
"extendedRequestId": null,
"cfId": null
}
List all the buckets
const listBuckets = await objectStorageClient.listBuckets();
console.log(listBuckets);
Reponse
{
"buckets": [
{
"Name": "mybucket",
"CreationDate": "2024-03-29T09:50:42.147Z"
}
]
}
List all the objects inside the bucket
const objectsInsideBucket = await bucket.listObjects(bucketName: 'mybucket');
console.log(objectsInsideBucket);
Response
{
"objects": [
{
"Key": "web/icon/promotion.webp",
"LastModified": "2024-07-09T00:16:06.865Z",
"ETag": "\"d18a28a70c56bad694b175842e6985ef\"",
"Size": 64097,
"StorageClass": "STANDARD"
},
{
"Key": "employees/John/profile.jpg",
"LastModified": "2024-05-02T20:25:14.914Z",
"ETag": "\"c4f8dfd0d8bdbe7dd44374613bf9e8dc\"",
"Size": 34639,
"StorageClass": "STANDARD"
},
{
"Key": "marketing/present/company-presentation.mp4",
"LastModified": "2024-05-02T16:23:07.405Z",
"ETag": "\"2ae672014edaf6170298f7695abc155d\"",
"Size": 9526626,
"StorageClass": "STANDARD"
}
]
}