I am trying to upload to an s3 bucket in next and have a couple of errors
I am using the package:
https://www.npmjs.com/package/@aws-sdk/client-s3
My Controller is:
@Post('test-doc')
@UseInterceptors(FileInterceptor('file'))
async testDocument(@UploadedFile() file: Express.Multer.File) {
return this.assetService.upload(file);
}
With my service:
async upload(file) {
return await uploadObject(file, 'SpacePlus', file.originalname);
}
And my functions which work with are ok with a helloworld text file create:
import {PutObjectCommand, S3Client} from "@aws-sdk/client-s3";
import {Logger} from "@nestjs/common";
// Validate the request and directs to the spaces endpoint
const s3Client = new S3Client({
endpoint: "",
forcePathStyle: false,
region: 'us-east-1',
credentials: {
accessKeyId: '',
secretAccessKey: ''
}
});
//Function to upload
const uploadObject = async (file, bucket, name) => {
// Define the params
const params = {
Bucket: bucket,
Key: "staging/" + String(name),
Body: file,
}
try {
const data = await s3Client.send(new PutObjectCommand(params));
Logger.log(
"Successfully uploaded object: " +
params.Bucket +
"/" +
params.Key
);
return data
}
catch (err)
{
console.log("Error", err)
}
}
export default uploadObject;
So the error is
TypeError: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received an instance of Object
And if I cast the file object to an array I get the this error:
Error MissingContentLength: UnknownError
So Im a little stuck on where to go next to get this working
3
Answers
I updated the controller to send the buffer
file which you are sending must be Buffer
try to get the buffer of file to be uploaded like code snippet in react.
You can send buffer instead of the file directly in the body in the uploadObject method as it is expecting buffer not instance of an object as pointed out in the error.
You can desconstruct the file by using
instead and send the buffer here.