Skip to main content
 首页 » 编程设计

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

2025年05月04日70JeffreyZhao

我正在尝试使用内置输入表单制作一个工作文件上传表单。它适用于“静态”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() 

和模板/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() 

内置的 File 似乎没有返回对象,因此 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): 
        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()