Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

FileUpload: fileuploadfilter.py

Line 
1 # FileUploadFilter
2 #
3 # Author: Michal Zylinski, michal.zylinski@gmail.com
4 #
5 # Version: 1.0
6 #
7
8
9 from cherrypy.lib.filter.basefilter import BaseInputFilter
10 import StringIO
11 import cgi
12 import guid
13
14 class FileUploadFilter(BaseInputFilter):
15         def __init__(self, pParsingContext):
16                 """
17                 ParsingContext = [(method, param in method, directory)]
18                 """
19                 self.ParsingContext = pParsingContext
20                 self.FilteringEnabled = False
21                 self.UploadParam = None
22                 self.UploadDirectory = None
23
24         def afterRequestHeader(self):
25                 URLPath = cpg.request.path
26                 Method = URLPath[URLPath.rfind('/')+1:]
27                 if Method in [Item[0] for Item in self.ParsingContext]:
28                         cpg.request.parsePostData = False
29                         self.UploadParam, self.UploadDirectory = [(Item[1], Item[2]) for Item in self.ParsingContext if Item[0] == Method][0]
30                         self.FilteringEnabled = True
31                 else:
32                         self.FilteringEnabled = False
33                         self.UploadParam = None
34                         self.UploadDirectory = None
35                        
36         def afterRequestBody(self):
37                 if self.FilteringEnabled is False: return
38                 # Read request body and put it in data
39                 len = int(cpg.request.headerMap.get("Content-Length","0"))
40                 if len: data = cpg.request.rfile.read(len)
41                 else: data=""
42                 newRfile = StringIO.StringIO(data)
43                 lowerHeaderMap = {}
44                 for key, value in cpg.request.headerMap.items():
45                                 lowerHeaderMap[key.lower()] = value
46                 forms = cgi.FieldStorage(fp = newRfile, headers = lowerHeaderMap, environ = {'REQUEST_METHOD':'POST'}, keep_blank_values = 1)
47                 for key in forms.keys():
48                         valueList = forms[key]
49                         if type(valueList) == type([]):
50                                         cpg.request.paramMap[key] = []
51                                         cpg.request.filenameMap[key] = []
52                                         cpg.request.fileTypeMap[key] = []
53                                         for item in valueList:
54                                                         cpg.request.paramMap[key].append(item.value)
55                                                         cpg.request.filenameMap[key].append(item.filename)
56                                                         cpg.request.fileTypeMap[key].append(item.type)
57                         else: #here comes file processing routine
58                                 if valueList.name == self.UploadParam:
59                                         OriginalFileExtension = valueList.filename[valueList.filename.rfind('.'):]
60                                         NewName = self.UploadDirectory+guid.generate()+OriginalFileExtension
61                                         SaveFile = file(NewName, 'wb')         
62                                         while 1:
63                                                 data = valueList.file.read(1024 * 8) # Read blocks of 8KB at a time
64                                                 if not data: break
65                                                 SaveFile.write(data)
66                                         SaveFile.close()
67                                         cpg.request.paramMap[key] = NewName
68                                         cpg.request.filenameMap[key] = valueList.filename
69                                         cpg.request.fileTypeMap[key] = valueList.type           
70                                 else:
71                                         cpg.request.paramMap[key] = valueList.value
72                                         cpg.request.filenameMap[key] = valueList.filename
73                                         cpg.request.fileTypeMap[key] = valueList.type
74
75
76 if __name__ == '__main__':     
77 #running test                           
78         from cherrypy import cpg
79         class Test:
80                 TempDir = 'c:\\temp\\'
81                 UploadContext = [('processUpload', 'fileob', TempDir)]
82                 _cpFilterList = [FileUploadFilter(UploadContext)]
83                
84                 @cpg.expose
85                 def index(self):
86                         return """<HTML><BODY>
87                         <FORM ACTION="processUpload" METHOD="POST" ENCTYPE="multipart/form-data">
88                         <INPUT TYPE="file" name="fileob">
89                         <INPUT TYPE="submit">
90                         </FORM>
91                         </BODY></HTML>
92                         """
93                        
94                 @cpg.expose
95                 def processUpload(self, fileob):
96                         yield 'File Name: %s<br>' % cpg.request.filenameMap['fileob']
97                         yield 'File Type: %s<br>' % cpg.request.fileTypeMap['fileob']
98                         yield 'Stored as: %s' % fileob
99                        
100         cpg.root = Test()
101         cpg.server.start()

Hosted by WebFaction

Log in as guest/cpguest to create tickets