मुझे नॉक्स के साथ काम करने के लिए अपना कोड नहीं मिला, मुझे 400 स्टेटस कोड मिलते रहे और मेरी फाइलें S3 पर अपलोड नहीं की जा रही थीं। इसलिए मैंने aws-sdk का इस्तेमाल किया और इसने जादू की तरह काम किया। मेरी फ़ाइलें अपलोड की जा रही हैं और मेरे मोंगो डेटाबेस में सहेजी जा रही हैं। उन लोगों के लिए जो एक ही समस्या से टकरा सकते हैं, मैंने यही किया:
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);
};