Skip to content

Instantly share code, notes, and snippets.

@jorke
Created October 24, 2024 11:09
Show Gist options
  • Save jorke/575fc7ec90a8b06a1fb3d559e93a2050 to your computer and use it in GitHub Desktop.
Save jorke/575fc7ec90a8b06a1fb3d559e93a2050 to your computer and use it in GitHub Desktop.
signed s3 upload
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