corriger bug fonction pour prendre un fichier à partir d'un form fonctionel #1

This commit is contained in:
Lazanimady Andrianirindrainy
2026-06-19 12:43:54 +02:00
parent b1ee077754
commit de3bcbaea2
5 changed files with 148 additions and 3 deletions

66
package-lock.json generated
View File

@@ -11,10 +11,12 @@
"dependencies": {
"dotenv": "^17.4.2",
"express": "^5.2.1",
"formidable": "^3.5.4",
"pdf-parse-fork": "^1.2.0"
},
"devDependencies": {
"@types/express": "^5.0.6",
"@types/formidable": "^3.5.1",
"@types/node": "^25.9.3",
"nodemon": "^3.1.14",
"ts-node": "^10.9.2",
@@ -62,6 +64,27 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
"node_modules/@noble/hashes": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
"integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
"license": "MIT",
"engines": {
"node": "^14.21.3 || >=16"
},
"funding": {
"url": "https://paulmillr.com/funding/"
}
},
"node_modules/@paralleldrive/cuid2": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.3.1.tgz",
"integrity": "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==",
"license": "MIT",
"dependencies": {
"@noble/hashes": "^1.1.5"
}
},
"node_modules/@tsconfig/node10": {
"version": "1.0.12",
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz",
@@ -136,6 +159,16 @@
"@types/send": "*"
}
},
"node_modules/@types/formidable": {
"version": "3.5.1",
"resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-3.5.1.tgz",
"integrity": "sha512-aFQijSGbD8JCeEST2LEbwR7faHynbt43lojLIcTM/QhB2U06h41ZVRFVEql+Z1xdL+aKGIzm69V/P/uSW9N6XA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/http-errors": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz",
@@ -247,6 +280,12 @@
"dev": true,
"license": "MIT"
},
"node_modules/asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
"license": "MIT"
},
"node_modules/balanced-match": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
@@ -456,6 +495,16 @@
"node": ">= 0.8"
}
},
"node_modules/dezalgo": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
"integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
"license": "ISC",
"dependencies": {
"asap": "^2.0.0",
"wrappy": "1"
}
},
"node_modules/diff": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz",
@@ -629,6 +678,23 @@
"url": "https://opencollective.com/express"
}
},
"node_modules/formidable": {
"version": "3.5.4",
"resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz",
"integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==",
"license": "MIT",
"dependencies": {
"@paralleldrive/cuid2": "^2.2.2",
"dezalgo": "^1.0.4",
"once": "^1.4.0"
},
"engines": {
"node": ">=14.0.0"
},
"funding": {
"url": "https://ko-fi.com/tunnckoCore/commissions"
}
},
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",

View File

@@ -17,10 +17,12 @@
"dependencies": {
"dotenv": "^17.4.2",
"express": "^5.2.1",
"formidable": "^3.5.4",
"pdf-parse-fork": "^1.2.0"
},
"devDependencies": {
"@types/express": "^5.0.6",
"@types/formidable": "^3.5.1",
"@types/node": "^25.9.3",
"nodemon": "^3.1.14",
"ts-node": "^10.9.2",

View File

@@ -0,0 +1,74 @@
import {Router, Request as ExpressRequest} from "express";
import formidable from "formidable";
import type { Files, File } from "formidable";
// import pdf_parse from "../modules/pdf-parse";
// ----------------------------------------
// Router config
// ----------------------------------------
const router = Router();
// ----------------------------------------
// Routes
// ----------------------------------------
router.get("/", (req,res) => {
let html: string = `
<form action="/new-purchase/file" method="POST" enctype="multipart/form-data">
<input type="file" name="image">
<button type="submit">Envoyer</button>
</form>`;
res.send(html);
});
router.post("/file", async (req,res) => {
try {
const files = await file_form_handler(req);
const file_paths: string[] = [];
for (const file of Object.values(files) as any[]) {
if (Array.isArray(file)) {
for (const f of file) {
file_paths.push(f.filepath);
}
} else {
file_paths.push(file.filepath);
}
}
const results_of_parsing = [];
for (const path of file_paths) {
results_of_parsing.push(path);
}
res.json(results_of_parsing);
} catch (error) {
console.error(error);
res.status(500).json({
error: error instanceof Error ? error.message : "Unknown error"
});
}
});
// fonction pour gérer la récéption des fichier par un form
function file_form_handler(req: ExpressRequest): Promise<Files> {
return new Promise<Files>((resolve, reject) => {
const form = formidable({ multiples: true});
form.parse(req, (error: Error | null, fields: any, files: Files) => {
if (error){
reject(error);
return;
}
resolve({ ...fields, ...files})
})
})
}
// ----------------------------------------
// Export router
// ----------------------------------------
export default router;

View File

@@ -15,4 +15,4 @@ router.get("/", (req, res) => {
// ----------------------------------------
// Export router
// ----------------------------------------
module.exports = router;
export default router;

View File

@@ -15,8 +15,11 @@ app.use(express.urlencoded( {extended: false }));
// ----------------------------------------
// Routes import
// ----------------------------------------
app.use("/status", require("./routes/status.routes"));
app.use("/new-purchase", require("./routes/purchase.routes"));
import statusRoutes from "./routes/status.routes";
import purchaseRoutes from "./routes/purchase.routes";
app.use("/status", statusRoutes);
app.use("/new-purchase", purchaseRoutes);
// ----------------------------------------
// Starting Server