• 07-10-2025, 14:08:01
    #1
    React ile bi admin panel geliştiriyorum kendi projem için. API tarafında da Nodejs (express) var.
    React tarafında axios ile formdata post atıyorum.

    Şöyle bir formum var;


    Örnek bir request JSON yapısı şöyle;
    {
        "kategoriId": 2,
        "adi": "deneme",
        "resim": "file_object",
        "tarif": [
            {
                "tarif": "deneme tarif 1",
                "resim": "file_object"
            },
            {
                "tarif": "deneme tarif 2",
                "resim": "file_object"
            },
            {
                "tarif": "deneme tarif 3",
                "resim": "file_object"
            },
            {
                "tarif": "deneme tarif 4",
                "resim": "file_object"
            }
        ]
    }
    file_object yazan yerlerim formdaki input file'dan aldığım resimler. Bunu request json'u formdata olarak düşünün.
    axios ile istek atıp express tarafındaki multer ile yakalıyorum.
    uploadHelper middleware:
    import fs from 'fs';
    import multer from 'multer';
    import { Request } from 'express';
    
    const storage = multer.diskStorage({
        destination: function (req: Request, file: Express.Multer.File, cb: Function) {
            if (!fs.existsSync(process.env.IMAGE_UPLOAD_PATH)) {
                fs.mkdirSync(process.env.IMAGE_UPLOAD_PATH, { recursive: true });
            }
            cb(null, process.env.IMAGE_UPLOAD_PATH);
        },
        filename: (req, file, cb) => cb(null, file.originalname)
    });
    export default multer({ storage });
    endpointim de şöyle;
    import { Router } from "express";
    import uploadHelper from "../Helpers/uploadHelper";
    import TarifService from "../Services/tarifService";
    
    export default function (app: Router) {
        app.post(
            '/tarifler',
            uploadHelper.single('resim'),
            async (req, res) => res.send(await new TarifService(req).adminTarifEkle(req.body)),
        );
    }
    Bu şekilde yapınca tarif dizisi altındaki resimleri multer ile yakalayamıyor ve yükleyemiyorum. Yakalamanın bir çözümü yada farklı bir yol bilen/düşüncesi olan var mı acaba ?
  • 07-10-2025, 14:23:26
    #2
    sorun çözüldü...
    çözüm aşağıdadır, merak edenler yada benden sonra ihtiyaç olanlar için

    import { Router } from "express";
    import uploadHelper from "../Helpers/uploadHelper";
    import TarifService from "../Services/tarifService";
     
    export default function (app: Router) {
        app.post(
            '/tarifler',
            uploadHelper.any(),
            async (req, res) => {
                const files = req.files as Array<Express.Multer.File>;
                res.send(await new TarifService(req).adminTarifEkle({
                    ...req.body,
                    resim: files.find(x => x.fieldname == 'resim').filename,
                    tarif: req.body.tarif.map((tarif, index) => {
                        return {
                            tarif: tarif.tarif,
                            resim: files.find(x => x.fieldname == `tarif[${index}][resim]`).filename,
                        };
                    }),
                }));
            },
        );
    }