一. 准备工作
- 需要一台具有公网IP的云服务器,腾讯云的轻量应用服务器就特别便宜,一个月不到10块钱
- 最好申请一个域名以及免费SSl证书(非必要)
- SSH工具以及FTP文件传输工具,推荐使用 Putty 和 Filezilla
- 配置好Python3环境,可参考前一篇文章 Centos7安装Python3
二. 开始手搓
- 引入python常用模块
from flask import Flask, abort,send_from_directory, request, jsonify
import sys,os
app = Flask(__name__)
@app.route('/')
def root():
return jsonify({'status': 404, 'message': 'not found'})
- 定义上传图片接口,POST方法,两个参数,path为图片存储的相对路径,file为文件数据
@app.route('/upload', methods=['POST'])
def upload():
try:
path = request.form.get('path')
file = request.files.get('file')
if path[0]=='/':path = path[1:]
filepath = os.path.join(DIR,path)
print(filepath)
if os.path.isfile(filepath):
return jsonify({'code': 400, 'msg': 'file exists'})
os.makedirs(os.path.dirname(filepath), exist_ok=True)
file.save(filepath)
return jsonify({'code': 200, 'url': request.url_root+path})
except Exception as e:
return jsonify({'code': 500, 'msg': 'error'})
- 定义获取图片接口
@app.route('/<path:filename>', methods=['GET'])
def file(filename):
filepath = os.path.join(DIR, filename)
if not os.path.isfile(filepath):
return jsonify({'code': 404, 'msg': 'file not found'})
return send_from_directory(DIR, filename, as_attachment=False)
- DIR为文件存储的根路径,默认8000端口
if __name__ == '__main__':
try:
port = int(sys.argv[1])
except (IndexError, ValueError):
port = 8000
try:
DIR = sys.argv[2]
except (IndexError, ValueError):
DIR = "./files/"
app.run(host='0.0.0.0',port=port)
三. 完整代码(已加入域名功能)
from flask import Flask, abort, send_from_directory, request, jsonify
import sys,os
app = Flask(__name__)
@app.route('/')
def root():
return jsonify({'status': 404, 'message': 'not found'})
@app.route('/upload', methods=['POST'])
def upload():
try:
path = request.form.get('path')
file = request.files.get('file')
if path[0]=='/':path = path[1:]
filepath = os.path.join(DIR,path)
print(filepath)
if os.path.isfile(filepath):
return jsonify({'code': 400, 'msg': 'file exists'})
os.makedirs(os.path.dirname(filepath), exist_ok=True)
file.save(filepath)
return jsonify({'code': 200, 'url': request.url_root+path})
except Exception as e:
return jsonify({'code': 500, 'msg': 'error'})
@app.route('/<path:filename>', methods=['GET'])
def file(filename):
filepath = os.path.join(DIR, filename)
if not os.path.isfile(filepath):
return jsonify({'code': 404, 'msg': 'file not found'})
return send_from_directory(DIR, filename, as_attachment=False)
@app.before_request
def check_host():
if request.host != '域名:8000':
abort(400)
if __name__ == '__main__':
try:
port = int(sys.argv[1])
except (IndexError, ValueError):
port = 8000
try:
DIR = sys.argv[2]
except (IndexError, ValueError):
DIR = "./files/"
app.run(host='0.0.0.0', port=port, ssl_context=('cert/域名.pem', 'cert/域名.key'))
三. 开始部署
-
将py文件命名为main.py
-
将代码中域名替换为自己的域名
-
将申请到点证书放入cert文件夹中,cert文件夹与main.py同目录
-
将代码中证书路径替换为对应的存放路径
-
完成后打包上传至服务器
四. 运行python程序
#进入程序存放路径
cd 存放路径
#使用默认端口以及文件存放根路径
nohup python mian.py &
#可自定义端口以及文件存放根路径
nohup python mian.py 8000 ./data &
五. 测试接口
- 使用Apipost或者Postman工具进行上传测试
- 成功获取到链接后在浏览器打开查看