Nodejs初试水Node + Backbone + Redis —— 公众便所

Nodejs初试水Node + Backbone + Redis —— 公众便所

这就是公众便所!噗,口误,是公众档所。

出去打印店或者什么的时候的临时储存盘。上传之后就得到提取码,直接拿到打印店什么的去就OK了。文件保留七天(还没写这个守护进程)。

项目地址:https://github.com/XadillaX/public-file-house

demo地址:http://dang.kacaka.ca/

嘛嘛,终于不是萌娘系了-。 -


13 回复

Node.js 初试水 Node + Backbone + Redis —— 公众档所

这就是公众便所!噗,口误,是公众档所。

出去打印店或者什么的时候的临时储存盘。上传之后就得到提取码,直接拿到打印店什么的去就 OK 了。文件保留七天(还没写这个守护进程)。

项目概述

该项目旨在提供一个简单的在线文件存储服务,用户可以上传文件并获取一个提取码。通过这个提取码,用户可以在任何地方访问他们的文件。文件将在服务器上保存七天,之后会被自动删除。

技术栈

  • Node.js: 用于后端逻辑处理。
  • Backbone.js: 用于前端逻辑处理和页面结构。
  • Redis: 用于存储文件元数据和提取码。

示例代码

后端(Node.js)
const express = require('express');
const bodyParser = require('body-parser');
const redis = require('redis');
const fs = require('fs');

const app = express();
app.use(bodyParser.json());

// 创建 Redis 客户端
const client = redis.createClient();

client.on('error', (err) => {
    console.log(`Redis Error: ${err}`);
});

app.post('/upload', (req, res) => {
    const file = req.files.file;
    const code = Math.random().toString(36).substr(2, 10); // 生成随机提取码

    // 保存文件到本地
    const filePath = `./uploads/${code}`;
    file.mv(filePath, (err) => {
        if (err) return res.status(500).send(err);

        // 存储提取码和文件路径到 Redis
        client.set(code, filePath, 'EX', 604800, (err) => {
            if (err) return res.status(500).send(err);
            res.send({ code });
        });
    });
});

app.get('/:code', (req, res) => {
    client.get(req.params.code, (err, reply) => {
        if (err || !reply) return res.status(404).send('File not found.');
        res.download(reply);
    });
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});
前端(Backbone.js)
$(document).ready(() => {
    const FileModel = Backbone.Model.extend({});
    const FileView = Backbone.View.extend({
        el: '#file-form',
        events: {
            'submit': 'onSubmit'
        },
        onSubmit(e) {
            e.preventDefault();
            const formData = new FormData(this.el);
            $.ajax({
                url: '/upload',
                method: 'POST',
                data: formData,
                processData: false,
                contentType: false,
                success: (data) => {
                    alert(`Your file code is: ${data.code}`);
                },
                error: (jqXHR, textStatus, errorThrown) => {
                    alert(`Error: ${textStatus} - ${errorThrown}`);
                }
            });
        }
    });

    const fileView = new FileView();
});

文件结构

public-file-house/
├── uploads/                  # 保存上传的文件
├── public/                   # 静态资源目录
│   ├── css/
│   ├── js/
│   └── index.html
├── server.js                 # 后端 Node.js 服务
└── client.js                 # 前端 Backbone.js 脚本

总结

这个项目展示了如何使用 Node.js、Backbone.js 和 Redis 来构建一个简单的在线文件存储服务。通过简单的前端表单上传文件,并生成一个提取码。用户可以通过这个提取码下载文件。文件会在服务器上保存七天,之后会自动删除。希望这个示例能帮助你理解如何结合这些技术来实现功能。


不错啊。。不过还没有试用

赞,有创意,文件直接存自己服务器上么 …

有创意!

是啊。

好吧 准备写个小脚本自动上传文件去了…

汝想做甚 -。 -

代码中充满了二次元…

赞一个~

一看就知道是宅男。

提取碼不好記。。

所以有个发送到飞信的功能啊-。 -

根据你的描述,“公众便所”实际上是一个用于临时存储文件的系统,用户上传文件后可以获取一个提取码,然后通过这个提取码在需要时从系统中下载文件。系统会将文件保存七天。

该项目使用了 Node.js、Backbone.js 和 Redis 技术栈来实现。以下是对每个技术组件的简要说明:

  1. Node.js:用于构建服务器端应用,处理HTTP请求,与客户端进行交互。
  2. Backbone.js:一种JavaScript库,用于构建前端应用的结构,包括模型、视图、路由器等。
  3. Redis:一个内存中的数据存储系统,用来快速地存储和检索数据,比如文件元数据和文件内容。

示例代码:

Node.js 后端

首先,你需要安装必要的依赖包,例如 express(用于创建HTTP服务器)、multer(用于处理文件上传)以及 redis(用于与Redis数据库交互)。

npm install express multer redis

然后你可以创建一个简单的Express应用来处理文件上传和检索:

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

// 设置Multer存储引擎
const storage = multer.memoryStorage(); // 使用内存存储引擎,适用于小型文件
const upload = multer({ storage: storage });

// 连接到Redis
const client = redis.createClient();
client.on('error', (err) => console.log('Redis Client Error', err));

app.post('/upload', upload.single('file'), async (req, res) => {
    const file = req.file;
    if (!file) return res.status(400).send('No file uploaded.');

    // 将文件名和内容存入Redis
    const key = `${Date.now()}-${file.originalname}`;
    await client.set(key, file.buffer);

    // 返回提取码(这里简单地使用文件名作为提取码)
    res.send({ key });
});

app.get('/download/:key', async (req, res) => {
    const key = req.params.key;

    // 从Redis中获取文件
    client.get(key, async (err, buffer) => {
        if (err) return res.status(500).send('Error retrieving file.');
        if (!buffer) return res.status(404).send('File not found.');

        res.setHeader('Content-Type', 'application/octet-stream');
        res.setHeader('Content-Disposition', `attachment; filename="${key}"`);
        res.send(buffer);
    });
});

app.listen(3000, () => {
    console.log('Server running on port 3000');
});

上述代码展示了如何使用Node.js和Express接收文件上传,并将文件内容存储到Redis中,同时提供一个接口供用户通过提取码下载文件。请注意,这只是一个基本示例,实际应用中还需要考虑错误处理、文件大小限制以及安全性等问题。

回到顶部