zoukankan      html  css  js  c++  java
  • web.py任意文件上传(windows下)

    web.py是一个python的web框架, 简单易用强大的功能. 以python的方式来写web.

    在上传文件上, 我一直遇到点问题, 终于解决了, 记录在这里. 我在网上搜了很久, 这方面的资料好少, 希望可以帮助有需要的人, web.py还是很好用的.

    以上都是参考了官方文档, 地址: http://webpy.org/cookbook/index.zh-cn

    项目目录格式

    说明: upload是上传文件的目录(win7下测试, 图片,文本等都正常), templates是html模板, sqlite.db是sqlite数据库文件, demo.py是源文件. run.bat和READE.txt没什么好说的.

    demo.py源代码如下:

    import web
    
    urls = (
        '/', 'index',
        '/add', 'add',
        '/upload', 'upload'
    )
    
    class index:
        def GET(self):
            todos = db.select('todo')
            return render.index(todos)
    
    class add:
        def POST(self):
            i = web.input()
            n = db.insert('todo', id = i.id, title = i.title)
            raise web.seeother('/')
    
    class upload:
        def POST(self):
            x = web.input(myfile = {})
            filedir = 'images' # change this to the directory you want to store the file in.
            if 'myfile' in x: # to check if the file-object is created
                filepath = x.myfile.filename.replace('\\','/') # replaces the windows-style slashes with linux ones.
                filename = filepath.split('/')[-1] # splits the and chooses the last part (the filename with extension)
                fout = open(filedir +'/'+ filename,'wb') # creates the file where the uploaded file should be stored
                fout.write(x.myfile.file.read()) # writes the uploaded file to the newly created file.
    #            fout.write(x.myfile.value) # writes the uploaded file to the newly created file.
                fout.close() # closes the file, upload complete.
            raise web.seeother('/')
    
    app = web.application(urls, globals())
    render = web.template.render('templates/')
    #db = web.database(dbn='sqlite', db=":memory:")
    db = web.database(dbn='sqlite', db="sqlite.db")
    
    conn = db._db_cursor().connection
    cursor = conn.cursor()
    cursor.execute('DROP TABLE todo')
    cursor.execute('''
    CREATE TABLE todo (
        id text primary key,
        title text,
        created timestamp,
        done boolean
    )
    ''')
    
    cursor.execute('''
    INSERT INTO todo (id, title) VALUES ('01', 'Learn web.py')
    ''')
    
    cursor.execute('''
    INSERT INTO todo (id, title) VALUES ('02', 'Learn python')
    ''')
    
    conn.commit()
    
    if __name__ == "__main__":
        app.run()
    

    上述的代码关键的地方, fout = open(filedir +'/'+ filename,'wb')

    官方文档给的例子是打开的模式是'w', 但是下面有一行说明:

    [事实上,一定要以"mb"模式打开文件(在windows下), 也就是二进制可写模式, 否则图片将无法上传。]

    我之前用w试着运行, 文本文件可以上传, 但是图片等文件, 就会文件错误, 于是修改成二进制文件的方式, 之后就正常了.

    源代码下载: web.py.zip

    作者:icejoywoo
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 短网址: http://goo.gl/ZiZCi
  • 相关阅读:
    HDU1813:Escape from Tetris(IDA)
    开发汉澳sinox64位,对接汉澳矩阵电脑
    新博客有了,文章转移到 http://www.iosxxx.com/
    Linux内核之于红黑树and AVL树
    MySQL用户及数据安全专题
    实现Android操作系统11种传感器介绍
    NSSCanner 提取 指定 字符串
    [置顶] 正则表达式应用:匹配IP地址
    某APK中使用了动态注册BroadcastReceiver,Launcher中动态加载此APK出现java.lang.SecurityException异常的解决方法
    JSTL解析——003——core标签库02
  • 原文地址:https://www.cnblogs.com/icejoywoo/p/2256054.html
Copyright © 2011-2022 走看看