add basic uploader using twisted.web, since its behaviour differs a bit from the...
authorMoritz Venn <ritzmo@users.schwerkraft.elitedvb.net>
Sat, 29 Aug 2009 17:38:39 +0000 (17:38 +0000)
committerMoritz Venn <ritzmo@users.schwerkraft.elitedvb.net>
Sat, 29 Aug 2009 17:38:39 +0000 (17:38 +0000)
webinterface/src/WebChilds/Uploader.py

index fbda006..106f7fc 100755 (executable)
@@ -1,69 +1,65 @@
-#from os import statvfs, path as os_path, system as os_system, chmod as os_chmod
-#from twisted.web2 import resource, responsecode, http, http_headers
-#
-#class UploadResource(resource.PostableResource):
-#      default_uploaddir = "/tmp/"
-#
-#      def render(self, req):
-#              self.args = req.args
-#              #############
-#              uploaddir = self.default_uploaddir
-#              if self.getArg("path"):
-#                      if os_path.isdir(self.getArg("path")):
-#                              uploaddir = self.getArg("path")
-#                              if uploaddir[-1] != "/":
-#                                      uploaddir += "/"
-#                      else:
-#                              return http.Response(responsecode.OK, {'content-type': http_headers.MimeType('text', 'html')}, "path '%s' to upload not existing!" % self.getArg("path"))
-#              #########
-#              if len(req.files):
-#                      #static.destination = uploaddir
-#                      return self.do_upload(req, uploaddir)
-#              else:
-#                      return self.do_indexpage(req)
-#
-#      def do_upload(self, req, uploaddir):
-#              for file in req.files:
-#                      import tempfile
-#                      (filename, mimetype, filehandler) = req.files[file][0]
-#                      filehandler.name = tempfile.mktemp(suffix=os_path.splitext(filename)[1], dir=uploaddir)
-#                      print "filehandler.name: ", filehandler.name
-#                      filehandler.seek(0, 2) # Seek to the end of the file.
-#                      filesize = filehandler.tell() # Get the position of EOF.
-#                      filehandler.seek(0) # Reset the file position to the beginning.
-#                      if filesize <= 0:
-#                              os_system("rm '%s'" % filehandler.name)
-#                              return http.Response(responsecode.OK, {'content-type': http_headers.MimeType('text', 'html')}, "filesize was 0, not uploaded")
-#                      else:
-#                              os_system("mv '%s' '%s' " % (filehandler.name, uploaddir + filename))
-#                              os_chmod(uploaddir + filename, 0755)
-#                              return http.Response(responsecode.OK, {'content-type': http_headers.MimeType('text', 'html')}, "uploaded to %s" % uploaddir + filename)
-#
-#      def do_indexpage(self, req):
-#              try:
-#                      stat = statvfs("/tmp/")
-#              except OSError:
-#                      return - 1
-#
-#              freespace = stat.f_bfree / 1000 * stat.f_bsize / 1000
-#
-#              return http.Response(responsecode.OK,
-#                                                       {'content-type': http_headers.MimeType('text', 'html')},
-#              """
-#                              <form method="POST" enctype="multipart/form-data">
-#                              <table>
-#                              <tr><td>Path to save (default is '%s')</td><td><input name="path"></td></tr>
-#                              <tr><td>File to upload</td><td><input name="file" type="file"></td></tr>
-#                              <tr><td colspan="2">Filesize must not be greather than %dMB! /tmp/ has not more free space!</td></tr>
-#                              <tr><td colspan="2"><input type="submit"></td><tr>
-#                              </table>
-#                              </form>
-#              """ % (self.default_uploaddir, freespace))
-#
-#      def getArg(self, key):
-#              if self.args.has_key(key):
-#                      return self.args[key][0]
-#              else:
-#                      return False
-#
-#
\ No newline at end of file
+from os import statvfs, path as os_path, chmod as os_chmod, write as os_write, \
+               close as os_close, unlink as os_unlink
+from twisted.web import resource, http
+from tempfile import mkstemp
+
+class UploadResource(resource.Resource):
+       default_uploaddir = "/tmp/"
+
+       def render_POST(self, req):
+               uploaddir = self.default_uploaddir
+               if req.args['path'][0]:
+                       if os_path.isdir(req.args['path'][0]):
+                               uploaddir = req.args['path'][0]
+                               if uploaddir[-1] != "/":
+                                       uploaddir += "/"
+                       else:
+                               req.setResponseCode(http.OK)
+                               req.setHeader('Content-type', 'text/html')
+                               return "path '%s' to upload not existing!" % req.args['path'][0]
+
+               data = req.args['file'][0]
+               if not data:
+                       req.setResponseCode(http.OK)
+                       req.setHeader('Content-type', 'text/html')
+                       return "filesize was 0, not uploaded"
+
+               fd, fn = mkstemp(dir = uploaddir)
+               cnt = os_write(fd, data)
+               os_close(fd)
+               os_chmod(fn, 0755)
+               
+               if cnt <= 0: # well, actually we should check against len(data) but lets assume we fail big time or not at all
+                       try:
+                               os_unlink(fn)
+                       except OSError, oe:
+                               pass
+                       req.setResponseCode(http.OK)
+                       req.setHeader('Content-type', 'text/html')
+                       return "error writing to disk, not uploaded"
+               else:
+                       req.setResponseCode(http.OK)
+                       req.setHeader('Content-type', 'text/html')
+                       return "uploaded to %s" % fn
+
+       def render_GET(self, req):
+               try:
+                       stat = statvfs("/tmp/")
+               except OSError:
+                       return - 1
+
+               freespace = stat.f_bfree / 1000 * stat.f_bsize / 1000
+
+               req.setResponseCode(http.OK)
+               req.setHeader('Content-type', 'text/html')
+               return """
+                               <form method="POST" enctype="multipart/form-data">
+                               <table>
+                               <tr><td>Path to save (default is '%s')</td><td><input name="path"></td></tr>
+                               <tr><td>File to upload</td><td><input name="file" type="file"></td></tr>
+                               <tr><td colspan="2">Filesize must not be greather than %dMB! /tmp/ has not more free space!</td></tr>
+                               <tr><td colspan="2"><input type="submit"></td><tr>
+                               </table>
+                               </form>
+               """ % (self.default_uploaddir, freespace)
+