def image_handle(environ, start_response): """main url process""" path = environ.get('PATH_INFO', '') image_url_regex = r'/([a-z0-9]{2})/([a-z0-9]{2})/([a-z0-9]{19,36})(-[sc]\d{2,4})?\.(gif|jpg|jpeg|png)$' match = re.search(image_url_regex, path) #print(image_url_regex, path, match) if match is not None: ids = match.groups() #print(ids) id = '{0}{1}{2}'.format(*ids) from store import ImSto imsto = ImSto() file = imsto.get(id) if file is None: imsto.close() return not_found(environ, start_response) org_path = '{0}/{1}/{2}.{4}'.format(*ids) org_file = '{0}/{1}'.format(THUMB_ROOT, org_path) if not os.path.exists(org_file): save_file(file, org_file) if ids[3] is None: dst_path = org_path dst_file = org_file else: dst_path = '{0}/{1}/{2}{3}.{4}'.format(*ids) dst_file = '{0}/{1}'.format(THUMB_ROOT, dst_path) #print(ids[3][1:]) size = int(ids[3][2:]) if size not in SUPPORTED_SIZE: print('unsupported size: {0}'.format(size)) imsto.close() return not_found(environ, start_response) thumb_image(org_file, size, dst_file) #print(dst_file) server_soft = environ.get('SERVER_SOFTWARE', '') if server_soft[:5] == 'nginx' and os.name != 'nt': imsto.close() start_response( '200 OK', [('X-Accel-Redirect', '{0}/{1}'.format(THUMB_PATH, dst_path))]) return [] #print(file.type) headers = [('Content-Type', str(file.type)), ('Content-Length', '{0.length}'.format(file)), ('Via', 'imsto')] #print(headers) start_response('200 OK', headers) # TODO: response file content #data = file.read() imsto.close() #return [data] fd = open(dst_file, 'r') return environ['wsgi.file_wrapper'](fd, 4096) return not_found(environ, start_response)
def manage(environ, start_response): path_info = environ.get('PATH_INFO', '') man_regex = r'^/([A-Za-z]+)/(env|Gallery|Stored)' match = re.search(man_regex, path_info) #print('match: {0}'.format(match)) if match is None: return not_found(environ, start_response) action = match.groups()[1] if (action == 'Gallery'): from cgi import FieldStorage form = FieldStorage(environ=environ) limit = 20 start = 0 if form.has_key("page") and form["page"].value != "": page = int(form["page"].value) if page < 1: page = 1 start = limit * (page - 1) start_response('200 OK', [('Content-type', 'text/plain')]) imsto = ImSto() gallery = imsto.browse(limit, start) import datetime dthandler = lambda obj: obj.isoformat() if isinstance( obj, datetime.datetime) else None if hasattr(imsto, 'close'): imsto.close() return [json.dumps(gallery, default=dthandler)] elif (action == 'Stored'): return stored_process(environ, start_response) #start_response('200 OK', [('Content-type', 'text/plain')]) #return ['Stored'] elif (action == 'env'): from _respond import print_env return print_env(environ, start_response) start_response('200 OK', [('Content-type', 'text/plain')]) return [path_info]
def stored_process(environ, start_response): from cgi import FieldStorage form = FieldStorage(environ=environ) #print(form.keys()) start_response('200 Ok', [('Content-type', 'text/javascript')]) method = environ['REQUEST_METHOD'].upper() if method == 'GET' or method == 'HEAD': return [json.dumps([False, 'bad request'])] oper = form['oper'] print(oper) from store import ImSto imsto = ImSto() if oper.value == 'delete': id = form['id'] return [json.dumps(imsto.delete(id.value))] if oper.value == 'add': new_file = form['new_file'] if new_file is None: return [json.dumps([False, 'invalid upload field'])] print(type(new_file)) result = [] if type(new_file) == type([]): for f in new_file: print('%r %r %r %r %r %r' % (f.name, f.filename, f.type, f.disposition, f.file, f.length)) id = imsto.store(f.file, ctype=f.type, name=f.filename) print('new_id: %r' % id) result.append(id) else: f = new_file print('single file %r %r' % (f.name, f.filename)) id = imsto.store(f.file, ctype=f.type, name=f.filename) print('new_id: %r' % id) result.append(id) if hasattr(imsto, 'close'): imsto.close() return [json.dumps(result)] else: return [json.dumps([False, 'invalid operation'])]
def main(argv=None): if argv is None: argv = sys.argv try: try: opts, args = getopt.getopt(argv[1:], "hi:q:lt:v", [ "help", "import=", "id=", "list", "test", "verbose", "limit=", "start=" ]) except getopt.error, msg: raise Usage(msg) #print(opts) #print(args) action = None store_file = None # option processing for option, value in opts: if option == "-v": verbose = True if option in ("-h", "--help"): raise Usage(help_message) if option in ("-i", "--import"): store_file = value print('store file: {0}'.format(store_file)) action = 'import' elif option in ("-l", "--list"): action = 'list' elif option in ("-t", "--test"): action = 'test' filename = value elif option in ("-q", "--id"): action = 'get' id = value else: pass print('action: {}'.format(action)) if (action == 'list'): imsto = ImSto() gallery = imsto.browse() for img in gallery['items']: #print(img) print("{0[filename]}\t{0[length]:8,d}".format(img)) return 0 elif (action == 'get') and id is not None: imsto = ImSto() if not imsto.getFs().exists(id): print('not found') return 1 gf = imsto.get(id) #print(gf) print("found: {0.name}\t{0.length}".format(gf)) return 0 elif (action == 'test'): print('filename: %r' % filename) fp = open(filename, 'rb') h = fp.read(32) print(getImageType(h)) return 0