python flask 上传下载 api_flask文件的上传和下载

这篇博客介绍了如何使用Python的Flask框架创建文件上传和下载API。首先,定义了允许的文件类型,并实现了一个上传接口,通过secure_filename确保文件名安全。上传成功后,返回一个token作为文件标识。接着,展示了文件下载功能,利用send_from_directory方法,强调需设置as_attachment=True以正确下载文件。最后,讨论了中文文件名的问题,并提出了一个不完全解决方案。
摘要由CSDN通过智能技术生成

from werkzeug.utils import secure_filename

from flask import Flask,render_template,jsonify,request

import time

import os

import base64

app = Flask(__name__)

UPLOAD_FOLDER='upload'

app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

basedir = os.path.abspath(os.path.dirname(__file__))

ALLOWED_EXTENSIONS = set(['txt','png','jpg','xls','JPG','PNG','xlsx','gif','GIF'])

# 用于判断文件后缀

def allowed_file(filename):

return '.' in filename and filename.rsplit('.',1)[1] in ALLOWED_EXTENSIONS

# 用于测试上传,稍后用到

@app.route('/test/upload')

def upload_test():

return render_template('upload.html')

# 上传文件

@app.route('/api/upload',methods=['POST'],strict_slashes=False)

def api_upload():

file_dir=os.path.join(basedir,app.config['UPLOAD_FOLDER'])

if not os.path.exists(file_dir):

os.makedirs(file_dir)

f=request.files['myfile'] # 从表单的file字段获取文件,myfile为该表单的name值

if f and allowed_file(f.filename): # 判断是否是允许上传的文件类型

fname=secure_filename(f.filename)

print fname

ext = fname.rsplit('.',1)[1] # 获取文件后缀

unix_time = int(time.time())

new_filename=str(unix_time)+'.'+ext # 修改了上传的文件名

f.save(os.path.join(file_dir,new_filename)) #保存文件到upload目录

token = base64.b64encode(new_filename)

print token

return jsonify({"errno":0,"errmsg":"上传成功","token":token})

else:

return jsonify({"errno":1001,"errmsg":"上传失败"})

if __name__ == '__main__':

app.run(debug=True)

上面我们写了一个上传接口,我们为了测试这个接口是否工作正常,还得写一个页面(upload.html):

提交

好了,页面也写完了,我们运行flask服务后,可以访问到http://127.0.0.1/test/upload页面,上传文件并提交后,我们的接口会返回如下信息:

{

"errmsg": "\u4e0a\u4f20\u6210\u529f",

"errno": 0,

"token": "MTQ2MzU4MDc5Mi5KUEc="

}

同时upload目录中也有了刚上传的文件,表明测试成功。

文件下载

文件下载要比上传简单的多,核心代码如下:

from flask import request,jsonify,send_from_directory,abort

import os

def download(filename):

if request.method=="GET":

if os.path.isfile(os.path.join('upload', filename)):

return send_from_directory('upload',filename,as_attachment=True)

abort(404)

这里主要需要注意的是send_from_directory方法,经过实测,需加参数as_attachment=True,否则对于图片格式、txt格式,会把文件内容直接显示在浏览器,对于xlsx等格式,虽然会下载,但是下载的文件名也不正确,切记切记

问题:上传过程中,如果文件名是中文  问题未解决

哪位兄弟解决了(文件重命名不算解决)能不能贴上代码

评论区一楼的兄弟:

把该行代码fname = secure_filename(f.filename)替换为 fname = f.filename

这个办法是可以解决,但是这样就缺少了secure_filename方法中的一些验证,

本打算重写这个方法,进行一些验证,但是对于中文应该做何种验证,又无从下手了,有木有有意见的大兄弟。

=================================================================================

码字不易望各位老铁多多支持

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值