diff --git a/packages/@uppy/aws-s3/src/HTTPCommunicationQueue.ts b/packages/@uppy/aws-s3/src/HTTPCommunicationQueue.ts index ebadfa6f00..bfcc9035a2 100644 --- a/packages/@uppy/aws-s3/src/HTTPCommunicationQueue.ts +++ b/packages/@uppy/aws-s3/src/HTTPCommunicationQueue.ts @@ -276,15 +276,21 @@ export class HTTPCommunicationQueue { signal, }).abortOn(signal)) as unknown as B // todo this doesn't make sense - // location will be missing from result if CORS is not correctly set up on the bucket. - return 'location' in result ? result : ( - { - // todo `url` is not really the final location URL of the resulting file, it's just the base URL of the bucket - // https://github.com/transloadit/uppy/issues/5388 - location: removeMetadataFromURL(url), - ...result, - } + const key = fields?.key + if (!key) { + console.error( + 'Expected `fields.key` to be returend but the backend/Companion', ) + } + this.#setS3MultipartState(file, { key: key! }) + + return { + ...result, + location: + (result.location as string | undefined) ?? removeMetadataFromURL(url), + bucket: fields?.bucket, + key, + } } async uploadFile( @@ -393,7 +399,8 @@ export class HTTPCommunicationQueue { try { signature = await this.#fetchSignature(this.#getFile(file), { - uploadId, + // Always defined for multipart uploads + uploadId: uploadId!, key, partNumber, body: chunkData, diff --git a/packages/@uppy/aws-s3/src/MultipartUploader.ts b/packages/@uppy/aws-s3/src/MultipartUploader.ts index 2ca8fdf5b4..c32b9d5efb 100644 --- a/packages/@uppy/aws-s3/src/MultipartUploader.ts +++ b/packages/@uppy/aws-s3/src/MultipartUploader.ts @@ -16,7 +16,7 @@ interface MultipartUploaderOptions { file: UppyFile log: Uppy['log'] - uploadId: string + uploadId?: string key: string } diff --git a/packages/@uppy/aws-s3/src/index.test.ts b/packages/@uppy/aws-s3/src/index.test.ts index a19825444b..feaccc0f62 100644 --- a/packages/@uppy/aws-s3/src/index.test.ts +++ b/packages/@uppy/aws-s3/src/index.test.ts @@ -50,7 +50,10 @@ describe('AwsS3Multipart', () => { getUploadParameters: () => ({ method: 'POST', url: 'https://bucket.s3.us-east-2.amazonaws.com/', - fields: {}, + fields: { + key: 'file', + bucket: 'https://bucket.s3.us-east-2.amazonaws.com/', + }, }), }) const scope = nock( @@ -89,6 +92,8 @@ describe('AwsS3Multipart', () => { ETag: 'test', etag: 'test', location: 'http://example.com', + key: 'file', + bucket: 'https://bucket.s3.us-east-2.amazonaws.com/', }, status: 200, uploadURL: 'http://example.com', diff --git a/packages/@uppy/aws-s3/src/index.ts b/packages/@uppy/aws-s3/src/index.ts index 5f2509fe74..ba181c6e6b 100644 --- a/packages/@uppy/aws-s3/src/index.ts +++ b/packages/@uppy/aws-s3/src/index.ts @@ -510,7 +510,7 @@ export default class AwsS3Multipart< return this.#client .get< AwsS3Part[] - >(`s3/multipart/${encodeURIComponent(uploadId)}?key=${filename}`, { signal }) + >(`s3/multipart/${encodeURIComponent(uploadId!)}?key=${filename}`, { signal }) .then(assertServerError) } @@ -524,7 +524,7 @@ export default class AwsS3Multipart< throwIfAborted(signal) const filename = encodeURIComponent(key) - const uploadIdEnc = encodeURIComponent(uploadId) + const uploadIdEnc = encodeURIComponent(uploadId!) return this.#client .post( `s3/multipart/${uploadIdEnc}/complete?key=${filename}`, @@ -633,7 +633,7 @@ export default class AwsS3Multipart< this.#assertHost('abortMultipartUpload') const filename = encodeURIComponent(key) - const uploadIdEnc = encodeURIComponent(uploadId) + const uploadIdEnc = encodeURIComponent(uploadId!) return this.#client .delete(`s3/multipart/${uploadIdEnc}?key=${filename}`, undefined, { signal, diff --git a/packages/@uppy/aws-s3/src/utils.ts b/packages/@uppy/aws-s3/src/utils.ts index 835d457dcc..924e448e94 100644 --- a/packages/@uppy/aws-s3/src/utils.ts +++ b/packages/@uppy/aws-s3/src/utils.ts @@ -11,7 +11,7 @@ export function throwIfAborted(signal?: AbortSignal | null): void { } } -export type UploadResult = { key: string; uploadId: string } +export type UploadResult = { key: string; uploadId?: string; bucket?: string } export type UploadResultWithSignal = UploadResult & { signal?: AbortSignal } export type MultipartUploadResult = UploadResult & { parts: AwsS3Part[] } export type MultipartUploadResultWithSignal = MultipartUploadResult & { @@ -25,4 +25,6 @@ export type UploadPartBytesResult = { export interface AwsBody extends Body { location: string + key: string + bucket: string } diff --git a/packages/@uppy/companion/src/server/controllers/s3.js b/packages/@uppy/companion/src/server/controllers/s3.js index a084de2cbe..19a91796c7 100644 --- a/packages/@uppy/companion/src/server/controllers/s3.js +++ b/packages/@uppy/companion/src/server/controllers/s3.js @@ -135,6 +135,7 @@ module.exports = function s3 (config) { res.json({ key: data.Key, uploadId: data.UploadId, + bucket: data.Bucket }) }, next) } @@ -360,6 +361,8 @@ module.exports = function s3 (config) { })).then(data => { res.json({ location: data.Location, + key: data.Key, + bucket: data.Bucket }) }, next) }