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