#node.js #gridfs #database-metadata
Вопрос:
Я использовал Node.js и GridFS загружают файлы изображений и сохраняют идентификатор пользователя и имя пользователя в метаданных, но я могу получить файл изображения только по идентификатору пользователя, когда метаданные содержат только идентификатор пользователя. Если я сохраню имя пользователя и телефон пользователя в метаданных, я получу пустой список таблиц, и система не отобразит «Файлов не существует !» Частичный код выглядит следующим образом.
//----------Upload Form-----------
<form action="/upload" method="post" enctype="multipart/form-data">
<div class="custom-file mb-3">
<input type="file" class="custom-file-input" name="file" id="file1"
onchange="readSingleFile(this.files)">
<label class="custom-file-label" for="file1" id="file-label">Choose_file</label>
</div>
<input type="submit" value="Submit" class="btn btn-primary btn-block">
<input class="metadata"type="text" name="UserID" value="{{user._id}}">
{{!-- <input class="metadata"type="text" name="UserName" value=" {{user.company_name}}">
<input class="metadata"type="eamil"name="UserPhone" value="{{user.Phone}}"> --}}
</form>
//-----********If do not input UserName and UserPhone code works fine ****----
//--------------------GFS-----------------------------
const mongoURI = process.env.MONGODB_URL;
// connection
const conn = mongoose.createConnection(mongoURI, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
let gfs;
conn.once("open", () => {
// init stream
gfs = new mongoose.mongo.GridFSBucket(conn.db, {
bucketName: "uploads",
});
});
//------------------------Create -storage Engine --------------
const storage = new GridFsStorage({
// url: (mongoURI, { useUnifiedTopology: true}),
url: mongoURI,
options: { useNewUrlParser: true, useUnifiedTopology: true },
file: (req, file) => {
return new Promise((resolve, reject) => {
crypto.randomBytes(16, (err, buf) => {
if (err) {
return reject(err);
}
const filename = buf.toString("hex") path.extname(file.originalname);
// const UserID = req.body
const fileInfo = {
filename: filename,
bucketName: "uploads",
metadata: req.body, // only way to upload metadata
};
resolve(fileInfo);
});
});
},
});
const upload = multer({ storage });
//-----------------Retrieve Image file -----------------
router.get("/pdf/:UserId", isLoggedIn, (req, res) => {
const file = gfs
.find({ metadata: { UserID: req.params.UserId } }) // metadata query
.toArray((err, file) => {
// Check if file
if (!file || file.legnth === 0) {
return res.status(404).json({
err: "No file exists",
});
}
// return res.json([file]);
res.render("users/list copy", { list: file });
});
});
//-------use hbs Table List all uploaded files -----------
<table class="table table-striped" id="table">
<thead>
<tr>
<th>Date Issued</th>
<th>File Name</th>
<th>Company</th>
<th>Download</th>
<th>Delete File</th>
</tr>
</thead>
<tbody>
{{#each list}}
<tr>
<td onclick="State()" class="magnifiable">{{this.uploadDate}}</td>
<td class="magnifiable">{{this.filename}}</td>
<td>{{this.metadata.UserName}}</td>
<td>
<a href="/image/{{this.filename}}">Statement View
<i class="fa fa-usd fa-lg" aria-hidden="true" style="color: orange" aria-
hidden="true"></i>
</a>
</td>
<td>
<a href="/file/del/{{this._id}}" onclick="return confirm('Are you sure to
delete this record?');" style="color:red"> Remove
<i class="fa fa-trash fa-lg" style="color:red" aria-hidden="true"> </i>
</a>
</td>
{{/each}}
</tr>
</tbody>
</table>
Моя проблема использование req.body в метаданных может сохранить много элементов, но если получить изображение с идентификатором пользователя в метаданных {} Я должен исключить другие поля ввода из формы загрузки. Оставьте там только одно поле ввода UerID. Затем запрос… gfs.find({ метаданные: { Идентификатор пользователя: req.параметры.Идентификатор пользователя } })… работает, и я могу иметь список файлов изображений с длинным шестнадцатеричным code.jpg или pdf. Но мне нужно имя пользователя, чтобы узнать, кто является владельцем файла. Если я не использую запрос метаданных, но используйте ….gfs.find().toArray(…..) ..и у меня могут быть другие поля ввода в форме загрузки , такие как Имя пользователя, в списке таблиц отображается вся загруженная информация о пользователе.
Пожалуйста, помогите мне решить проблему с метаданными.