Python中如何实现一个内网文件中转系统?求批判与建议

个人背景

本科学过一点计算机应用的科目,接触过一点 VBA 和 python 的编程知识,软件开发属于民科+菜鸟水平。

用户需求

公司分好几个部门,分布在不同地理位置,内网没有 ftp 服务,也没有跨部门的文件共享服务。大部分的内网用户不能访问互联网,但全部用户都可以访问 21cn 的企业邮箱(容量只有 4M )。想发大的文件给别的部门的同事,只能提前通知对方清理邮箱或者发到私人邮箱。

战略层

计划用 django 开发一个文件的中转系统,让用户上传文件,生成下载链接。用户把下载链接通过邮件发给收件人,对方点击链接就可以下载文件。 架构大概是 freebsd + python + django + uwsgi + nginx

这一层考虑的意外情况有: 1、文件同名 文件上传时,对“日期+文件名”用 hashlib 库做 10 bit 的 blake2b digest,得到的字符串作为文件的唯一 id,也是储存在服务器目录的文件名。下载链接是 http://IP-ADDRESS/app/get/file-id,然后 django 从数据库查到文件上传时候的名字和实际储存的路径,再传递给 nginx,nginx 在把储存的文件重命名提供给用户。

2、文件内容重复 每天下班之后,django 跑一个后台程序,对储存在服务器的文件,未有 hash 值的,做 hash。发现相同 hash 值的文件的话,将新上传的文件的物理储存路径改为已有的文件,删除掉新上传的文件。用户下载的时候可以下载到正确的文件名和内容,系统的储存空间也不会浪费。当然,只有在用户大量上传文件,导致储存空间不够用的时候才需要清理重复的文件。

3、用户上传和下载大文件,占用跨部门网络链接的带宽 部门内部是百兆到桌面,服务器部署在部门 A,部门 A 的对外链接只有 6M 带宽。针对来自不同部门的用户进行上传和下载的限速。限速功能实现之前,通过文字提醒用户不要上传下载超过 200M 的文件。

功能层

1.0 版本: 在首页展示使用说明 接受上传文件 操作日志存入数据库 按日期倒序,展示同一 ip 上传的文件列表,可以删除 通过链接可以下载

2.0 版本: 限速 搜索 管理员页面,可以删除任何文件

3.0 版本: 各种统计信息,访问量、文件数量、下载次数等等 上传的进度条

由于没有什么知识和经验,总是担心这些粗浅的想法有错漏,希望各位高手不吝赐教,谢谢!


Python中如何实现一个内网文件中转系统?求批判与建议

26 回复

兄弟,听你的描述,你说的莫不是这宝贝?

https://owncloud.org/


我理解你想做一个内网的文件中转系统。这个需求很常见,核心就是搭建一个简单的文件服务器,让内网用户可以上传和下载文件。

给你一个基于Flask的完整实现方案,包含了上传、下载、文件列表和删除功能:

import os
from flask import Flask, request, send_file, jsonify, render_template_string
from werkzeug.utils import secure_filename

app = Flask(__name__)
UPLOAD_FOLDER = './uploads'
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif', 'zip'}

app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024  # 限制16MB

# 确保上传目录存在
os.makedirs(UPLOAD_FOLDER, exist_ok=True)

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

@app.route('/')
def index():
    # 简单的HTML界面
    html = '''
    <!doctype html>
    <title>文件中转站</title>
    <h1>上传文件</h1>
    <form method=post enctype=multipart/form-data action="/upload">
      <input type=file name=file>
      <input type=submit value=上传>
    </form>
    <h2>文件列表</h2>
    <ul>
    {% for file in files %}
        <li>
            <a href="/download/{{ file }}">{{ file }}</a>
            <a href="/delete/{{ file }}" onclick="return confirm('确定删除?')">[删除]</a>
        </li>
    {% endfor %}
    </ul>
    '''
    files = os.listdir(UPLOAD_FOLDER)
    return render_template_string(html, files=files)

@app.route('/upload', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return jsonify({'error': '没有文件部分'}), 400
    
    file = request.files['file']
    if file.filename == '':
        return jsonify({'error': '未选择文件'}), 400
    
    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        return jsonify({'message': '上传成功', 'filename': filename}), 200
    
    return jsonify({'error': '文件类型不允许'}), 400

@app.route('/download/<filename>')
def download_file(filename):
    filepath = os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(filename))
    if os.path.exists(filepath):
        return send_file(filepath, as_attachment=True)
    return jsonify({'error': '文件不存在'}), 404

@app.route('/delete/<filename>')
def delete_file(filename):
    filepath = os.path.join(app.config['UPLOAD_FOLDER'], secure_filename(filename))
    if os.path.exists(filepath):
        os.remove(filepath)
        return jsonify({'message': '删除成功'}), 200
    return jsonify({'error': '文件不存在'}), 404

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000, debug=True)

这个方案有几个关键点:

  1. 使用Flask作为Web框架,轻量且简单
  2. 文件上传做了安全处理(secure_filename防止路径遍历)
  3. 限制了文件类型和大小
  4. 提供了基本的Web界面
  5. 支持上传、下载、删除完整操作

要运行这个系统:

  1. 安装依赖:pip install flask
  2. 运行脚本:python app.py
  3. 内网其他机器访问 http://你的IP:5000 即可使用

对于生产环境,你还需要考虑用户认证、日志记录、文件分片上传等高级功能。不过作为内网使用,这个基础版本已经足够。

总结建议:先用这个基础版本跑起来,根据实际需求再逐步完善功能。


谢谢。
不过我们大部分电脑配置都很低,还在跑 win xp 和 IE6。用 owncloud 还有用户培训的问题,我只是部门 A 的小兵,很难培训其它部门的用户。

owncloud 真不用培训,和用百度网盘一样
想法不错,可是用链接来传递真的好吗?这样子很多人没法对自己的文件进行管理

我觉得你们只需要一个内阿旺 ftp 服务器……

建一个 ftp 最简单

看了你写的企划不觉得你是菜鸟水平
但是 为什么不直接购买一台 Windows Server (或运行你的 FreeBSD )然后逐个电脑配置网络共享

4M 的邮箱感觉是上古时代的东西。

感觉还不如 ftp。。。

可以内网架一个飞秋 FeiQ, 传文件,开共享,外加还能聊聊天。

带宽太低,如果同时多几个人上传或下载。你部门的带宽就全占了。所以需要一个带文件传输功能的内网即时聊天软件。


ftp 传中文文件有时候会有问题

win server - windows 并不会有编码问题(

拿着锤子看什么都像钉子。owncloud 需要培训,你写的系统就不需要吗

SMB 企不是美哉,还有你说的地理位置是多大的跨度?一般国内跨度的话问题都不大,看你的描述,文件容量也不大,通过 AD 创建部门组,按部门分文件夹,按子文件夹设置权限,总的按部门给访问权限,细的可以手动在 AD 里添加,免去了在 server 上更改

seafile 也挺好用的啊

这要看多大,我们学校以前资源站用 flashfxp 传,5G 文件妥妥的没问题

filezilla 分分钟搭建一个 FTP
不过程序员都喜欢造轮子,折腾呗


每个用户都只能看到自己电脑上传的文件 也可以删除已经上传的文件


我们的内网没有建立 windows 域

谢谢大家的回复 大部分人都推荐基于 FTP 的方案 我们会再仔细考虑的

感觉 kodexplorer 可以满足需求


你自己不会配而已。


这还考虑啥,搭个 FTP SERVER 不是 10 分钟的事儿……

seafile 不也可以,也是 django 的

。。。那么麻烦干嘛,samba 就好啦

飞秋 满足不了吗?文件加密 当我没说 ///

回到顶部