Created
October 24, 2024 11:09
-
-
Save jorke/575fc7ec90a8b06a1fb3d559e93a2050 to your computer and use it in GitHub Desktop.
signed s3 upload
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import https from "node:https"; | |
import { XMLParser } from "fast-xml-parser"; | |
import fs from 'node:fs'; | |
import { | |
S3Client, | |
PutObjectCommand | |
} from "@aws-sdk/client-s3"; | |
import { | |
getSignedUrl, | |
S3RequestPresigner, | |
} from "@aws-sdk/s3-request-presigner"; | |
const put = (url, data) => { | |
return new Promise((resolve, reject) => { | |
const req = https.request( | |
url, | |
{ method: "PUT", headers: { "Content-Length": new Blob([data]).size } }, | |
(res) => { | |
let responseBody = ""; | |
res.on("data", (chunk) => { | |
responseBody += chunk; | |
}); | |
res.on("end", () => { | |
res.headers['etag'] | |
const parser = new XMLParser(); | |
if (res.statusCode >= 200 && res.statusCode <= 299) { | |
// resolve(parser.parse(responseBody, true)); | |
resolve(res.headers['etag']) | |
} else { | |
reject(parser.parse(responseBody, true)); | |
} | |
}); | |
}, | |
); | |
req.on("error", (err) => { | |
reject(err); | |
}); | |
req.write(data); | |
req.end(); | |
}); | |
}; | |
async function signReq (size, ContentType) { | |
const s3Client = new S3Client({}) | |
const command = new PutObjectCommand( | |
{ | |
Bucket: 'cv-edge', | |
Key: 'hi.png', | |
ContentType, | |
ContentLength: size | |
}); | |
return getSignedUrl(s3Client, | |
command, | |
{ | |
expiresIn: 3600, | |
signableHeaders: new Set(['Content-Type','Content-Length']) | |
} | |
) | |
} | |
let data = null; | |
try { | |
data = fs.readFileSync('hi.png'); | |
} catch (err) { | |
console.error(err); | |
} | |
const url = await signReq(new Blob([data]).size, 'image/png') | |
console.log(url) | |
const resp = await put(url, data); | |
console.log(resp) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment