feat(multipart): Implement full multipart upload support with persistent manager, periodic cleanup, and API integration
This commit is contained in:
@@ -54,8 +54,9 @@ export class BucketController {
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /:bucket - List objects
|
||||
* GET /:bucket - List objects or multipart uploads
|
||||
* Supports both V1 and V2 listing (V2 uses list-type=2 query param)
|
||||
* Multipart uploads listing is triggered by ?uploads query parameter
|
||||
*/
|
||||
public static async listObjects(
|
||||
req: plugins.http.IncomingMessage,
|
||||
@@ -64,6 +65,12 @@ export class BucketController {
|
||||
params: Record<string, string>
|
||||
): Promise<void> {
|
||||
const { bucket } = params;
|
||||
|
||||
// Check if this is a ListMultipartUploads request
|
||||
if (ctx.query.uploads !== undefined) {
|
||||
return BucketController.listMultipartUploads(req, res, ctx, params);
|
||||
}
|
||||
|
||||
const isV2 = ctx.query['list-type'] === '2';
|
||||
|
||||
const result = await ctx.store.listObjects(bucket, {
|
||||
@@ -127,4 +134,47 @@ export class BucketController {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* GET /:bucket?uploads - List multipart uploads
|
||||
*/
|
||||
private static async listMultipartUploads(
|
||||
req: plugins.http.IncomingMessage,
|
||||
res: plugins.http.ServerResponse,
|
||||
ctx: S3Context,
|
||||
params: Record<string, string>
|
||||
): Promise<void> {
|
||||
const { bucket } = params;
|
||||
|
||||
// Get all multipart uploads for this bucket
|
||||
const uploads = ctx.multipart.listUploads(bucket);
|
||||
|
||||
// Build XML response
|
||||
await ctx.sendXML({
|
||||
ListMultipartUploadsResult: {
|
||||
'@_xmlns': 'http://s3.amazonaws.com/doc/2006-03-01/',
|
||||
Bucket: bucket,
|
||||
KeyMarker: '',
|
||||
UploadIdMarker: '',
|
||||
MaxUploads: 1000,
|
||||
IsTruncated: false,
|
||||
...(uploads.length > 0 && {
|
||||
Upload: uploads.map((upload) => ({
|
||||
Key: upload.key,
|
||||
UploadId: upload.uploadId,
|
||||
Initiator: {
|
||||
ID: 'S3RVER',
|
||||
DisplayName: 'S3RVER',
|
||||
},
|
||||
Owner: {
|
||||
ID: 'S3RVER',
|
||||
DisplayName: 'S3RVER',
|
||||
},
|
||||
StorageClass: 'STANDARD',
|
||||
Initiated: upload.initiated.toISOString(),
|
||||
})),
|
||||
}),
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user