使用内置的文件表单上传web.py文件

时间:2015-03-09 14:46:35

标签: python python-2.7 web web.py shutil

我正在尝试使用内置输入表单创建工作文件上传表单。它可以很好地使用静态' html输入表单(使用shutil.copyfileobject),但它不会使用内置的工作。

import web, shutil
from web import form

urls = ('/', 'Index')

app = web.application(urls, globals())
render = web.template.render('templates/')

fileForm = form.Form(form.File('myfile'))

class Index(object):
    def GET(self):
        f = fileForm()
        return render.index(f)
    def POST(self):
        f = fileForm()
        fi = f['myfile']
        mydir = 'uploads/'
        shutil.copy(fi, mydir)

if __name__ == "__main__":
    app.run()

和templates / index.html

$def with (f)
<!DOCTYPE html>
<html>

<head> 

<title>Title</title>

</head>

<body>
<form name="main" method="post" enctype="multipart/form-data" action="">
$:f.render()
<input type="submit">
</form>
</body>

</html>

错误:

<type 'exceptions.TypeError'> at /

coercing to Unicode: need string or buffer, File found


Python
C:\Python27\lib\ntpath.py in abspath, line 486 

Web
POST http://localhost:8080/ 


Traceback (innermost first)
C:\Python27\lib\ntpath.py in abspath 
479.
480.else:  # use native Windows method on Windows
481.    def abspath(path):
482.        """Return the absolute version of a path."""
483.
484.        if path: # Empty path must return current working directory.
485.            try:
486.                path = _getfullpathname(path) ...
487.            except WindowsError:
488.                pass # Bad path - return unchanged.
489.        elif isinstance(path, unicode):
490.            path = os.getcwdu()
491.        else:
492.            path = os.getcwd()

内置文件似乎没有返回一个对象,所以shutil.copyfileobject似乎不起作用。

请帮我解决一下。

1 个答案:

答案 0 :(得分:-1)

import web, shutil
from web import form

urls = ('/', 'Index')

app = web.application(urls, globals())
render = web.template.render('templates/')

fileForm = form.Form(form.File('myfile'))

class Index(object):
    def GET(self):
        f = fileForm()
        return render.index(f)

    def POST(self):
        x = web.input(myfile={})
        filedir = '/tmp/'
        if 'myfile' in x:
            filepath=x.myfile.filename.replace('\\','/')
            filename=filepath.split('/')[-1]
            fout = open(filedir +'/'+ filename,'w')
            fout.write(x.myfile.file.read())
            fout.close()

if __name__ == "__main__":
    app.run()