python文件上传与七牛云存储

HTML方式

通过form表单提交文件,设置enctype="multipart/form-data"

ajax方式

通过构建FormData,append添加参数,以键值对形式
html文件

js文件

var formData = new FormData();
$(document).ready(function(){
    $("#upload").click(function(){
    formData.append('file', $('#file')[0].files[0]);
        $.ajax({
            url: '/upload/',
            type: 'POST',
            cache: false,
            data: formData,
            processData: false,
            contentType: false
        }).done(function(res) {
            console.log('success')
        }).fail(function(res) {
            console.log('fail')
        });
    })
})

调整样式

原生H5inputfile太丑陋,调整文件上传样式,可以通过设置Input透明度为零的方式

逻辑实现

文件上传的逻辑处理 python代码
通过uuid生成唯一文件名,并且去除不合法字符,并且通过文件后缀名限制文件类型

@app.route('/upload/',methods={'post'})
def upload():
    file=request.files['file']
    if file.filename.find('.') > 0:
        file_ext=file.filename.rsplit('.',1)[1].strip().lower()
    #print(app.config['ALLOWED_EXT'])
    if file_ext in app.config['ALLOWED_EXT']:
        file_name=str(uuid.uuid1()).replace('-','')+'.'+file_ext
        url=save_to_local(file,file_name)
        if url!=None:
            db.session.add(Image(url,current_user.id))
            db.session.commit()

    return redirect('/profile/%d' % current_user.id)

def save_to_local(file,file_name):
    save_dir=app.config['UPLOAD_DIR']
    file.save(os.path.join(save_dir,file_name))
    return '/image/'+file_name

在app.conf里设定常量 设置文件格式 以及服务器存放位置

ALLOWED_EXT=set(['png','jpg','jpeg','bmp','gif']) 
UPLOAD_DIR='D:/upload/' 

通过插件进行测试,返回200,页面跳转到个人主页,即文件上传成功。可以进入到目录查看。


python文件上传与七牛云存储_第1张图片

将图片上传到云上

申请七牛云账户,创建存储空间。

查看python sdk开发者文档 七牛Python sdk文档

python文件上传与七牛云存储_第2张图片
官方文档

按照文档初始化 上传步骤执行
qiniusdk.py文件


from ins import app
from qiniu import Auth, put_stream, put_data
import os

#需要填写你的 Access Key 和 Secret Key
access_key = app.config['QINIU_ACCESS_KEY']
secret_key = app.config['QINIU_SECRET_KEY']
#构建鉴权对象
q = Auth(access_key, secret_key)
#要上传的空间
bucket_name = app.config['QINIU_BUCKET_NAME']
domain_prefix = app.config['QINIU_DOMAIN']

def qiniu_upload_file(source_file, save_file_name):
    # 生成上传 Token,可以指定过期时间等
    token = q.upload_token(bucket_name, save_file_name)

    ret, info = put_data(token, save_file_name, source_file.stream)

    print(type(info.status_code),info)
    if info.status_code == 200:
        return domain_prefix + save_file_name
    return None

upload方法中仅仅更改一行代码,调用qiniusdk中编写的qiniu_upload_file方法,返回上传后的云端url地址,并添加到数据库中

@app.route('/upload/',methods={'post'})
def upload():
    file=request.files['file']
    file_ext=''
    if file.filename.find('.') > 0:
        file_ext=file.filename.rsplit('.',1)[1].strip().lower()
    if file_ext in app.config['ALLOWED_EXT']:
        file_name=str(uuid.uuid1()).replace('-','')+'.'+file_ext
        #url=save_to_local(file,file_name)
        url=qiniu_upload_file(file,file_name)
        if url!=None:
            db.session.add(Image(url,current_user.id))
            db.session.commit()

打开浏览器,图片上传服务器成功,并且添加到了数据库中。

python文件上传与七牛云存储_第3张图片
image.png

你可能感兴趣的:(python文件上传与七牛云存储)