ZIPアップロード

土曜日, 1月 8th, 2011 by

ZIPファイルをアップロードして、そのままホスティングできるアプリケーションを作ってみました。

サンプル環境
http://study-python2.appspot.com/
※特にセキュリティーをかけていませんので、不審なファイルは開かないようご注意ください。

試しにアップロードしたファイル
UFO Quiz
⇒htmlファイル、swfファイル、xmlファイル、jsファイルから構成されていますが、正常にアップロードできました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/usr/bin/env python

from google.appengine.ext import webapp
from google.appengine.ext.webapp import util
from google.appengine.ext import db

import urllib
import zipfile

class MainHandler(webapp.RequestHandler):
  def get(self):
    self.response.out.write('<form action="/" enctype="multipart/form-data" method="post"><input type="hidden" name="phpMyAdmin" value="cfc2644bd9c947213a0141747c2608b0" /><input type="file" name="file"><input type="submit" value="Upload"></form>')
    for zip in Zip.all().order('-datetime').fetch(10):
      self.response.out.write(zip.name + '<br>')
      for file in zip.files:
        self.response.out.write('-<a href="/file/%(zipkey)s/%(filename)s?phpMyAdmin=cfc2644bd9c947213a0141747c2608b0">%(filename)s</a><br>' % {'filename': file.name,'encodedFilename': urllib.quote_plus(file.name.encode('utf-8')), 'zipkey': zip.key()})
      self.response.out.write('<br>')
  def post(self):
    self.response.out.write("upload")
    archive = zipfile.ZipFile(self.request.POST.get('file').file)
    zip = Zip(name = self.request.POST.get('file').filename)
    zip.put()
    for f in archive.namelist():
      file = File(zip = zip, name = f.decode('Shift-JIS'), data = archive.read(f))
      file.put()
    self.redirect('/')

class FileHandler(webapp.RequestHandler):
  def get(self, key1, key2):
    for file in Zip.get(key1).files.filter('name', urllib.unquote(key2).decode('utf-8')):
      self.response.out.write(file.data)
      ext = file.name.split(".")[-1].lower()
      ctype = {
        'css': 'text/css',
        'js': 'application/x-javascript',
        'png': 'image/png',
        'jpg': 'image/jpeg',
        'jpeg': 'image/jpeg',
        'gif': 'image/gif'
      }
      for key in ctype:
        if ext == key:
          self.response.headers['Content-Type'] = ctype[key].encode('utf-8')

def main():
  application = webapp.WSGIApplication(
    [
      ('/', MainHandler),
      ('/file/([^/]+)/(.+)', FileHandler),
    ],
                     debug=True)
  util.run_wsgi_app(application)

class Zip(db.Model):
  datetime = db.DateTimeProperty(auto_now_add = True)
  name = db.StringProperty()

class File(db.Model):
  data = db.BlobProperty()
  name = db.StringProperty()
  zip = db.ReferenceProperty(Zip, collection_name = 'files')

if __name__ == '__main__':
  main()

Facebook comments:

comments

Leave a Reply


Get Adobe Flash player
single