Non riuscivo a far funzionare il mio codice con knox, continuavo a ricevere uno statusCode 400 e i miei file non venivano caricati su S3. Quindi ho usato aws-sdk e ha funzionato come per magia. I miei file vengono caricati e salvati nel mio database mongo. Per coloro che potrebbero incontrare lo stesso problema, questo è quello che ho fatto:
const { config } = require("aws-sdk");
module.exports = (express, app, formidable, fs, os, gm, s3, mongoose, io) => {
//os.tmpDir = os.tmpdir;
let Socket;
io.on("connection", function (socket) {
Socket = socket;
});
const singleImage = new mongoose.Schema({
filename: {
type: String,
require: true,
},
votes: {
type: Number,
require: true,
},
});
let singleImageModel = mongoose.model("singleImage", singleImage);
let router = express.Router();
router.get("/", function (req, res, next) {
res.render("index", { host: app.get("host") });
});
router.post("/upload", function (req, res, next) {
// File upload
function generateFilename(filename) {
let ext_regex = /(?:\.([^.]+))?$/;
let ext = ext_regex.exec(filename)[1];
let date = new Date().getTime();
let charBank = "abcdefghijklmnopqrstuvwxyz";
let fstring = "";
for (let i = 0; i < 15; i++) {
fstring += charBank[parseInt(Math.random() * 26)];
}
return (fstring += date + "." + ext);
}
let tmpFile, nFile, fName;
let newForm = new formidable.IncomingForm();
newForm.keepExtensions = true;
newForm.parse(req, function (err, fields, files) {
tmpFile = files.upload.path;
fName = generateFilename(files.upload.name);
nFile = os.tmpDir() + "\\" + fName;
res.writeHead(200, { "Content-type": "image/JPG" });
res.end();
});
newForm.on("end", function () {
fs.rename(tmpFile, nFile, function () {
// Resize the image and upload this file into the S3 bucket
gm(nFile)
.resize(300)
.write(nFile, function () {
// Upload to the S3 Bucket
/* fs.readFile(nFile, function (err, buf) {
let req = knoxClient.put(fName, {
"Content-Length": buf.length,
"Content-Type": "image/JPG",
"x-amz-acl": "public-read",
}); */
const fileContent = fs.readFileSync(nFile);
const params = {
Bucket: require("../config").S3Bucket,
Key: fName,
Body: fileContent,
};
s3.upload(params, function (err, data) {
// Delete the Local file
fs.unlink(nFile, function (err) {
console.log("Local file deleted!");
if (err) {
console.error(err);
}
});
console.log("PRINT FILE: ", fName);
if (err) {
console.log("ERROR MSG: ", err);
res.status(500).send(err);
} else {
//This means that the file is in the S3 Bucket
console.log(fName + " is in the S3 bucket");
let newImage = new singleImageModel({
filename: fName,
votes: 0,
}).save();
Socket.emit("status", { msg: "Saved!!", delay: 3000 });
Socket.emit("doUpdate", {});
res.status(200).end();
}
});
/* req.on("response", function (res) {
if (res.statusCode == 200) {
} else {
console.log(
err +
fName +
" did not get to the database or S3 bucket so " +
nFile +
" was not deleted " +
res.statusCode
);
console.log(res.statusMessage);
}
}); */
// req.end(buf);
// });
});
});
});
});
app.use("/", router);
};