Я успешно отправил файл в базу данных, используя multer-gridfs-storage, но единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что я хочу добавить дополнительную информацию, такую как AccountID, UserName и т. Д., В объект метаданных в db.i. пытался прикрепить эту информацию, как эта file[0].AccountID="145236
, прежде чем добавлять ее в форму данных, но при отправке ее объект метаданных БД был пустым. Может ли кто-нибудь помочь мне, пожалуйста,
код бэкенда:
const express = require("express");
const path = require("path");
const mongoose = require("mongoose");
const multer = require("multer");
const cors = require("cors");
const GridFsStorage = require("multer-gridfs-storage");
const Grid = require("gridfs-stream");
const crypto = require("crypto");
const router = express.Router();
const app = express();
app.use(express.json());
app.use(cors());
//Connect to DB
const mongoURI =
my-mongo-uri;
const conn = mongoose.createConnection(mongoURI);
mongoose.connect(mongoURI, { useNewUrlParser: true });
let gfs;
conn.once("open", () => {
gfs = Grid(conn.db, mongoose.mongo);
gfs.collection("Cours");
console.log("Connection Successful");
});
// Create storage engine
const storage = new GridFsStorage({
url: mongoURI,
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err);
}
const filename = file.originalname;
const fileInfo = {
filename: filename,
bucketName: "Cours",
metadata: {}, // i want to store additional information here
};
resolve(fileInfo);
});
});
},
});
const upload = multer({ storage });
router.post("/", upload.single("img"), (req, res, err) => {
if (res) {
res.json({ message: "Cours envoyé avec succès" });
} else {
if (err) {
res.json({ message: "Échec d'envoi" });
}
}
});
module.exports = router;
Код внешнего интерфейса:
import React, { useState, useEffect } from "react";
import { connect } from "react-redux";
import { setAlert } from "../../actions/alert";
import Alert from "../../Components/alert";
import { usePromiseTracker } from "react-promise-tracker";
import { trackPromise } from "react-promise-tracker";
import PropTypes from "prop-types";
const Cours = ({ setAlert, auth: { user } }) => {
const Post = (e) => {
e.preventDefault();
const file = document.getElementById("inputGroupFile01").files;
const formData = new FormData();
formData.append("img", file[0]);
trackPromise(
fetch("/UploadCours/", {
method: "POST",
body: formData,
}).then((res) =>
setAlert(
typeof file[0] === "undefined"
? "Veuillez insérer un fichier"
: "Cours publié avec succès",
typeof file[0] === "undefined" ? "danger" : "success"
)
)
);
};
const { promiseInProgress } = usePromiseTracker();
return (
<div className="col p-3 ">
<div classname="container">
<Alert />
<h1 className="mb-3">Publier Cours </h1>
<form>
<div className="input-group mb-3 w-50">
<div className="custom-file">
<input
type="file"
className="custom-file-input "
id="inputGroupFile01"
aria-describedby="inputGroupFileAddon01"
required
/>
<label className="custom-file-label" htmlFor="inputGroupFile01">
Choose file
</label>
</div>
</div>
{promiseInProgress ? (
<button type="button" className="btn btn-primary">
<i
className="fa fa-refresh fa-spin"
style={{ marginRight: "5px" }}
/>
Uploading ...
</button>
) : (
<button
type="button"
className="btn btn-primary"
onClick={(e) => Post(e)}
>
Upload
</button>
)}
</form>
</div>
</div>
);
};
Cours.prototype = {
auth: PropTypes.object.isRequired,
};
const mapStateToProps = (state) => ({
auth: state.auth,
});
export default connect(mapStateToProps, { setAlert })(Cours);
желаемый результат: ссылка на изображение