Hi @Coderr,
It’s because the event.body
is base64
encoded.
You need to use Buffer.from(event.body, 'base64').toString('utf8')
.
Full code:
import { initializeApp } from 'firebase/app'
import { getStorage, ref, uploadString } from 'firebase/storage'
const Busboy = require('busboy')
exports.handler = async event => {
return new Promise(resolve => {
const fields = {}
const busboy = new Busboy({
headers: event.headers
})
busboy.on('file', (fieldname, filestream, filename, _, mimeType) => {
filestream.on('data', data => {
fields[fieldname] = {
content: data,
filename,
type: mimeType
}
})
})
busboy.on('field', (fieldName, value) => {
fields[fieldName] = value
})
busboy.on('finish', () => {
resolve(fields)
})
busboy.write(Buffer.from(event.body, 'base64').toString('utf8'))
}).then(formData => {
return uploadString(ref(getStorage(initializeApp({
/* firebase stuff */
})), formData.name), formData.file.content.toString('base64'), 'base64').then(() => {
return {
body: JSON.stringify(true),
statusCode: 200
}
})
})
}
Note: This is my form:
<form enctype = "multipart/form-data" method = "POST" name = "fileForm">
<p>
<label>
File name:
<input type = "text" name = "name"/>
</label>
</p>
<p>
<label>
File:
<input type = "file" name = "file"/>
</label>
</p>
<p>
<button>
Send
</button>
</p>
</form>
So if your form has different fields and names (it most likely will), you’d have to make adjustments in your serverless code.