Add support for file uploads with custom S3 endpoints

Addresses #5459
This commit is contained in:
Michaël 2024-04-03 09:32:45 -04:00
parent 5c4e5bf19e
commit f0d31ed27a
3 changed files with 11 additions and 8 deletions

3
.github/AUTHORS.md vendored
View File

@ -8,4 +8,5 @@ Contributors
* Andrew Kingston - [@aptkingston](https://github.com/aptkingston)
* Michael Drury - [@mike12345567](https://github.com/mike12345567)
* Peter Clement - [@PClmnt](https://github.com/PClmnt)
* Rory Powell - [@Rory-Powell](https://github.com/Rory-Powell)
* Rory Powell - [@Rory-Powell](https://github.com/Rory-Powell)
* Michaël St-Georges [@CSLTech](https://github.com/CSLTech)

View File

@ -5,7 +5,7 @@
export let value = null
$: dataSources = $datasources.list
.filter(ds => ds.source === "S3" && !ds.config?.endpoint)
.filter(ds => ds.source === "S3")
.map(ds => ({
label: ds.name,
value: ds._id,

View File

@ -300,11 +300,6 @@ export const getSignedUploadURL = async function (ctx: Ctx) {
ctx.throw(400, "The specified datasource could not be found")
}
// Ensure we aren't using a custom endpoint
if (datasource?.config?.endpoint) {
ctx.throw(400, "S3 datasources with custom endpoints are not supported")
}
// Determine type of datasource and generate signed URL
let signedUrl
let publicUrl
@ -317,6 +312,7 @@ export const getSignedUploadURL = async function (ctx: Ctx) {
try {
const s3 = new AWS.S3({
region: awsRegion,
endpoint: datasource?.config?.endpoint as string,
accessKeyId: datasource?.config?.accessKeyId as string,
secretAccessKey: datasource?.config?.secretAccessKey as string,
apiVersion: "2006-03-01",
@ -324,7 +320,13 @@ export const getSignedUploadURL = async function (ctx: Ctx) {
})
const params = { Bucket: bucket, Key: key }
signedUrl = s3.getSignedUrl("putObject", params)
publicUrl = `https://${bucket}.s3.${awsRegion}.amazonaws.com/${key}`
if (datasource?.config?.endpoint) {
publicUrl = `${datasource.config.endpoint}/${bucket}/${key}`
}
else {
publicUrl = `https://${bucket}.s3.${awsRegion}.amazonaws.com/${key}`
}
} catch (error: any) {
ctx.throw(400, error)
}