前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一日一技:超级简单搭建更加稳定安全的文件分享服务器

一日一技:超级简单搭建更加稳定安全的文件分享服务器

作者头像
青南
发布2020-02-26 13:24:52
1.3K0
发布2020-02-26 13:24:52
举报
文章被收录于专栏:未闻Code未闻Code

摄影:产品经理

必胜客的披萨比意大利的更符合中国人的口味

在公众号以前的文章里面,我们提到,如果想简单的分享一下文件,我们可以使用一行 Python 命令:

代码语言:javascript
复制
python3 -m http.server

这条命令会开启一个文件分享服务,通过在浏览器访问http://ip:8000可以看到运行这条命令的文件夹下面的全部文件。点击即可下载。如下图所示:

这种方法,确实简单。但有3个问题:

  1. 一次只能下载一个文件,如果文件比较大,在下载的过程中其他人无法下载其他文件。
  2. 当前文件夹下面的所有文件都会出现在网页上,容易导致敏感数据泄露。如果你只想让别人下载其中一个文件,你需要单独给这个文件创建一个文件夹,并在这个文件夹里面执行命令。
  3. 这个简单的网络服务不稳定。

那有没有更稳定、安全同时也不太难的方案呢?当然是有,那就是使用 fastapi。

fastapi 基于starlette 开发。而 starlette里面有一个返回类型叫做FileResponse。使用它,可以非常方便地返回文件。我们来看看代码。

首先安装三个库uvicorn/fastapi/aiofiles:

代码语言:javascript
复制
pip install uvicorn
pip install fastapi
pip install aiofiles

然后编写代码并保存为FileServer.py

代码语言:javascript
复制
import os
from fastapi import FastAPI
from starlette.responses import FileResponse


@app.get('/record/{filename}')
def get_record(filename: str):
    path = os.path.join('output', filename)
    if not os.path.exists(path):
        return {'success': False, 'msg': '文件不存在!'}
    response = FileResponse(path)
    return response

其中,我把所有文件都存放在当前文件夹下面的output文件夹中。用户通过访问http://ip:端口/record/文件名。服务拿到文件名以后,拼出完整的文件路径,传入FileResponse类并回response 对象。

以上就是全部代码。非常简单直观。

现在我们来运行这个文件服务:

代码语言:javascript
复制
uvicorn FileServer:app --host 0.0.0.0 --port 8888

这样,你想分享具体哪个文件,你就构造一个 URL:http://ip:8888/record/文件名发给别人。别人直接访问这个 URL 就能来下载对应的文件了。只要对方不知道其他文件的文件名,就无法看到或者下载其他文件。

如果想更安全,你还可以给每个文件做一个单独的文件编号,把编号-地址对应关系存放在数据库中。用户请求的时候,传入的是文件编号,你从数据库查出文件的真实路径再通过FileResponse返回。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-02-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档