Nodejs 前后台分离如何共享文件

Nodejs 前后台分离如何共享文件

请教,我做了一个nodejs的网站,mongodb的,现在如何能够后台上传的文件让前台的nodejs服务器也能够读取呢,是单独建立一个文件服务器么,哪要怎么进行操作呢,本人是个新手,求指教,给个思路即可

5 回复

Node.js 前后台分离如何共享文件

在构建一个基于 Node.js 和 MongoDB 的网站时,经常会遇到需要让前端和后端共享文件的需求。例如,用户通过后台上传图片或文档,而前端需要访问这些文件。下面是一个基本的思路和示例代码,帮助你实现这一需求。

思路

  1. 文件存储:将文件保存到服务器上的某个目录。
  2. 文件路径管理:使用数据库(如 MongoDB)来存储文件的路径信息。
  3. 文件访问权限:确保只有授权的用户可以访问特定的文件。
  4. 文件服务器:可以考虑使用专门的文件服务器(如 AWS S3),但本文主要讨论本地文件系统。

示例代码

假设你有一个简单的文件上传功能,并且希望前端能够访问这些文件。

后端代码 (Express.js)

首先,你需要一个 Express.js 服务器来处理文件上传和文件路径存储。

const express = require('express');
const multer = require('multer');
const mongoose = require('mongoose');
const path = require('path');

const app = express();
const upload = multer({ dest: 'uploads/' }); // 存储上传文件的目录

// 连接 MongoDB
mongoose.connect('mongodb://localhost:27017/mydatabase', { useNewUrlParser: true, useUnifiedTopology: true });

// 文件模型
const FileSchema = new mongoose.Schema({
    filename: String,
    path: String,
    originalname: String,
    mimetype: String,
    size: Number
});

const File = mongoose.model('File', FileSchema);

// 文件上传路由
app.post('/upload', upload.single('file'), async (req, res) => {
    const file = req.file;
    const newFile = new File({
        filename: file.filename,
        path: file.path,
        originalname: file.originalname,
        mimetype: file.mimetype,
        size: file.size
    });
    await newFile.save();
    res.json(newFile);
});

// 获取文件的路由
app.get('/files/:id', async (req, res) => {
    const fileId = req.params.id;
    const file = await File.findById(fileId);
    if (!file) return res.status(404).send('File not found');
    res.download(path.join(__dirname, file.path), file.originalname);
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
前端代码 (React.js 示例)

前端可以通过 AJAX 请求获取文件路径,并显示文件。

import React, { useState } from 'react';
import axios from 'axios';

function App() {
    const [file, setFile] = useState(null);
    const [files, setFiles] = useState([]);

    const handleUpload = async () => {
        const formData = new FormData();
        formData.append('file', file);
        const response = await axios.post('/upload', formData, {
            headers: {
                'Content-Type': 'multipart/form-data'
            }
        });
        setFiles([...files, response.data]);
    };

    return (
        <div>
            <input type="file" onChange={e => setFile(e.target.files[0])} />
            <button onClick={handleUpload}>Upload</button>
            <ul>
                {files.map(f => (
                    <li key={f._id}>
                        <a href={`/files/${f._id}`} target="_blank">{f.originalname}</a>
                    </li>
                ))}
            </ul>
        </div>
    );
}

export default App;

总结

通过上述示例代码,你可以看到如何在 Node.js 中实现文件上传、存储和读取。关键点在于:

  1. 使用 multer 处理文件上传。
  2. 将文件信息存储到 MongoDB 数据库中。
  3. 提供文件下载接口,使前端能够访问这些文件。

希望这能帮助你更好地理解和实现前后台文件共享的功能!


补充:前台后台分离,公用一个数据库,前台的端口是3000,后台的是3001,

你写个配置文件啊,文件存放的根目录,然后去读就行了,弄什么文件服务器?

我的意思是,我再D盘建立了两个项目,一个叫bk,一个叫bkerp,bkerp是后台,用于上传文件及录入信息,bk是前台,bkerp上传的文件怎么让bk也 获取呢,我不会的

在前后台分离的Node.js应用中,通常会有一个API服务器负责处理前端请求和数据库交互,而文件存储则可能需要单独处理。你可以通过以下几种方式来实现前后台文件共享:

  1. 使用公共文件夹

    • 在你的项目中创建一个公共文件夹(例如public/uploads),用来存放用户上传的文件。
    • 当用户上传文件时,将其保存到该文件夹。
    • API服务器可以直接访问这些文件,并将它们提供给前端。
  2. 通过API服务提供文件

    • 创建一个路由(例如/api/files/:filename)用于提供文件下载。
    • 这个路由可以从指定的文件夹中读取文件,并返回给前端。

示例代码

文件上传和保存

const express = require('express');
const multer = require('multer');

const app = express();
const upload = multer({ dest: 'public/uploads/' });

app.post('/upload', upload.single('file'), (req, res) => {
    const file = req.file;
    console.log(`File uploaded: ${file.originalname}`);
    res.send({ message: 'File uploaded successfully', filename: file.filename });
});

文件下载

app.get('/api/files/:filename', (req, res) => {
    const filePath = `public/uploads/${req.params.filename}`;
    res.download(filePath);
});

思路

  • 文件上传:前端通过表单或AJAX发送文件数据到后端。后端使用multer等中间件处理文件上传,并将文件保存到公共文件夹中。
  • 文件下载:前端通过发送请求到特定的API路由来获取文件。后端通过路由读取文件并将其作为响应返回给前端。

这种方式可以确保文件在一个统一的位置被管理和访问,避免了文件分散存储带来的管理困难。同时,这种方式也便于扩展和维护。

回到顶部