Saya telah mengirim permintaan ini dari klien.

if(file){
      const data = new FormData()
      const fileName = Date.now() + file.name
      data.append('file', file) // file comes from state while submitting
      data.append('name', fileName)
      try {
        await axios.post('/upload_image', data)      
      } catch (error) {
        console.log(error.message);
      }
}

Nodejs

const multer = require('multer')


// file upload
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    console.log(req.body);
    cb(null, "./public/images/");
  },
  filename: (req, file, cb) => {
    cb(null, req.body.name)
  },
});
const upload = multer({ storage });
router.post("/upload_image", upload.single('file'), (req,res)=>{
  console.log(req.body);
    try {
        res.status(200).json("file uploaded successfully")
    } catch (error) {
        console.log(error.message);
    }
});

Jika saya mencetak req.body di

router.post("/upload_image", upload.single('file'), (req,res)=>{
 console.log(req.body.name)
console.log(req.file)
......................
.......................
})

Di sini nama dicetak dan req.file juga dicetak. Tapi, di dalam

const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    ...................
..............................
  },
  filename: (req, file, cb) => {
    console.log(req.body.name); //undefined  
    cb(null, req.body.name)
  },
});

Nama menjadi tidak terdefinisi dan aplikasi mogok. Mengapa objek req tidak masuk ke fungsi diskStorage. apa yang terjadi disini?

1
Prasanga Thapaliya 28 Mei 2021, 17:54

1 menjawab

Jawaban Terbaik

Dari multi dokumentasi:

Perhatikan bahwa req.body mungkin belum terisi penuh. Itu tergantung pada urutan klien mentransmisikan bidang dan file ke server.

Jika Anda menambahkan nama sebelum file di frontend, nama tersebut harus tersedia di req.body.name.

// Append name first before we send the file
// so we can access it in the backend
data.append('name', fileName);
data.append('file', file);

Atau, Anda dapat mengirim nama file secara langsung dengan file sebagai argumen ke-3 ke fungsi append:

data.append('file', file, fileName);

Anda kemudian dapat mengakses nama file di backend dengan req.file.originalname. Lihat Minta Parsing di Panduan Node.js gratis ini kapan pun Anda bekerja dengan file upload di Node.js.

1
Maxim Orlov 28 Mei 2021, 16:06