2015-03-09 3 views
2

Я пытаюсь создать рабочую форму для загрузки файлов, используя встроенную форму ввода. Он отлично работает с «статической» формой ввода html (с использованием файла shutil.copyfileobject), но он не будет работать с использованием встроенного.Загрузка файла web.py с использованием встроенного файла Форма

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() 

встроенный в файл, кажется, не возвращать объект, так shutil.copyfileobject не кажется, Работа.

Пожалуйста, помогите мне разобраться.

+0

Вы помещаете 'form.Form (form.File ('myfile'))': вы имели в виду просто 'form.File ('myfile')'? –

+0

Ну, это синтаксис: form.Form (форма ввода 1, форма ввода 2). Они вообще не говорят о форме файла на webpy.org, вот где я нашел ее: http://webpy.readthedocs.org/en/latest/api.html#module-web.form ... ........ с использованием вашей версии: Объект файла, который нельзя назвать – ypppy

+0

А, моя ошибка. В качестве второго вопроса: 'shutil.copy' ожидает' fi' (от 'fi = f ['myfile']') как строку (с указанием пути к файлу). На основе [этого примера] (http://webpy.org/cookbook/fileupload), похоже, что это объект File. –

ответ

-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()