我正在try 将图像文件上传到AWS S3存储桶.我正在使用Node/Express生成一个预先签名的URL,以便从Reaction前端将所述图像直接上传到S3.问题是,我可以上传的文件作为一个文件(大小相同的本地PC),但它没有文件扩展名.也就是说,它只有带符号的字符,例如文件类型为9c9743b9-4dd7-4afa-af06-c060fb0fb175
的文件,而不是文件类型为PNG的9c9743b9-4dd7-4afa-af06-c060fb0fb175.png
以下是我到目前为止try 过的一小段内容
后端
// My controller
try {
const payload = await AwsS3Service.getSignedUrlService();
res.status(200).send({
success: true,
data: payload
});
...
const s3 = new aws.S3({
region: config.awsS3.region,
accessKeyId: config.awsS3.accessKeyId,
secretAccessKey: config.awsS3.secretAccessKey,
signatureVersion: config.awsS3.signatureVersion
})
const getSignedUrlService = async () => {
const imageName = crypto.randomUUID()
const params = ({
Bucket: config.awsS3.bucketName,
Key: imageName,
Expires: 120 // in sec
})
const uploadUrl = await s3.getSignedUrlPromise('putObject', params)
return uploadUrl
}
前端
const [final, setFinal] = useState<FileList | any>('')
const [img, setImg] = useState<typeof formState.file>(null)
const handleImageChange = (e: ChangeEvent<HTMLInputElement>) => {
const file = e.target.files && e.target.files[0]
if (e.target.files) {
setFinal(e.target.files[0]!)
}
const { type, name } = file as File
setImgName(name)
setImgType(type)
const fileReader = new FileReader()
fileReader.onload = (e) => {
setImg(e.target?.result)
}
fileReader.readAsDataURL(file as Blob)
}
const handleFormSubmit: SubmitHandler<IImage> = async (data: IImage) => {
try {
const signedUrl = await axios({ method: 'GET', url: `${config.API_URL}/awss3` })
const formData = new FormData()
formData.append('file', final[0])
const resUpload = await fetch(`${signedUrl.data.data}`, {
method: 'PUT',
headers: { 'Content-Type': 'multipart/form-data' },
body: final
})
if (resUpload.status === 200) {
// redirect
}
} catch(err: any) {
alert(`An error occured. ${err.message}`)
}
}
return (
<form onSubmit={e => e.preventDefault()}>
<Stack>
<Box>
<InputLabel htmlFor='imgfile'>Image File</InputLabel>
<picture>
{ img
? <img src={img} alt='Image preview' height={90} width={160} />
: <Box sx={{ height: 90, width: 160, backgroundColor: '#555' }}></Box>
}
</picture>
<input type='file' accept='image/*' id='imgfile' name='imgFile' onChange={handleImageChange} />
</Box>
</Stack>
<Button type='submit' onClick={handleSubmit(handleFormSubmit)}>
Submit
</Button>
</form>
)
我已经有一段时间无法解决这个问题了.任何帮助都是非常感激的.感谢您的阅读.