python文件上传与七牛云存储

HTML方式

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

<form action="UploadFile.ashx" method="post" enctype="multipart/form-data">
    <input type="file" name="fileUpload" />
    <input type="submit" value="上传文件" />
</form>

ajax方式

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

<div id="uploadForm">
    <input id="file" type="file"/>
    <button id="upload" type="button">upload</button>
</div>

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透明度为零的方式

<div class="ps-image" style="width:300px;height:300px;border:0px sold red; background:url('/images/ps.png')">  
<input type="file" id="file" style="filter:alpha(opacity=0);opacity:0;width:100%;height:100%;"/>  
</div>  

逻辑实现

文件上传的逻辑处理 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 sdk开发者文档 七牛Python sdk文档

官方文档

按照文档初始化 上传步骤执行
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()

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

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容