I want to create an API to receive uploaded file from web. And then I will process the checking on the file(to see whether a .png is a real .png instead of .exe), then send the file over to another API.
But now i am stuck at receiving file part.
I been searching around in google and stackoverflow, but neither of the method is work.
Where i host my API: Firebase Functions
Sample code:
html code:
<html>
<body>
<form ref='uploadForm'
id='uploadForm'
action='https://<project>.cloudfunctions.net/api/upload'
method='post'
encType="multipart/form-data">
<input type="file" name="sampleFile" />
<input type='submit' value='Upload!' />
</form>
</body>
</html>
NodeJS Code:
formidable
const functions = require('firebase-functions');
const express = require('express');
const app = express();
app.post('/upload', function (req, res) {
console.log('initializing upload')
var IncomingForm = require('formidable').IncomingForm
var form = new IncomingForm()
form.uploadDir = 'uploads'
form.parse(req, function (err, fields, files) {
if (err) {
console.log('some error', err)
res.status(400).send(err)
} else if (!files.file) {
console.log('no file received')
res.status(400).send('no file received')
} else {
var file = files.file
console.log('saved file to', file.path)
console.log('original name', file.name)
console.log('type', file.type)
console.log('size', file.size)
res.status(400).send(file.path, file.name, file.type, file.size)
}
})
});
exports.api = functions.https.onRequest(app)
connect-busboy
const functions = require('firebase-functions');
const express = require('express');
const app = express();
var fs = require('fs');
var busboy = require('connect-busboy');
//...
app.use(busboy());
//...
app.post('/upload', function(req, res) {
var fstream;
req.pipe(req.busboy);
req.busboy.on('file', function (fieldname, file, filename) {
console.log("Uploading: " + filename);
res.status('200').send('uploaded')
// fstream = fs.createWriteStream(__dirname + '/files/' + filename);
// file.pipe(fstream);
// fstream.on('close', function () {
// res.redirect('back');
// });
});
});
exports.api = functions.https.onRequest(app)
express-fileupload
const functions = require('firebase-functions');
const express = require('express');
const fileUpload = require('express-fileupload');
const app = express();
// default options
app.use(fileUpload());
app.post('/upload', function(req, res) {
console.log('upload initializing')
if (!req.files)
return res.status(400).send('No files were uploaded.');
// The name of the input field (i.e. "sampleFile") is used to retrieve the uploaded file
let sampleFile = req.files.sampleFile;
if(req.files){
console.log('File Uploaded')
res.status('200').send('File uploaded!');
}
});
exports.api = functions.https.onRequest(app)
multer
const functions = require('firebase-functions');
const express = require('express'); // call express
const app = express(); // define our app using express
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
const router = express.Router();
const multer = require('multer');
var storage = multer.memoryStorage()
var upload = multer({ storage: storage })
const readChunk = require('read-chunk');
const fileType = require('file-type');
var returnSuccess = {
resultCode: 1,
resultDesc: '',
resultData: '',
dataCount: 0,
resultAction: '',
timeStamp: Date.now()
}
var returnFailed = {
resultCode: -1,
resultDesc: '',
resultAction: '',
timeStamp: Date.now()
}
router.post('/fileChecker', upload.single('doc'), function (req, res, next) {
console.log('Initilize FileChecker')
var files = []
var checkResults = []
var file = req.file
files = req.files
console.log(file)
console.log(files)
if(file){
console.log('got the FILE!')
}
res.status(200).send('Processed Ntg')
});
app.use(router)
exports.api = functions.https.onRequest(app)
*Additional Note:
1)For the multer, firebase hosting seems like not compatible with dest option. It will have deployment error if set the dest option.
2)All the code was tested after deployed to firebase hosting, i didn't test on my local.
I am running out of idea whats wrong is going on.. Please help..