12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- import redis, os, random, string, re
- from datetime import timedelta
- from flask import Flask, request, render_template, send_from_directory
- from werkzeug.utils import secure_filename
- r = redis.Redis('localhost')
- app = Flask(__name__)
- DEFAULT_TTL = 86400
- MAX_TTL = 259200
- UPLOAD_DIR = '/storage/'
- UPLOAD_SIZE = 200 * 1024 * 1024
- def tdelta(input):
- keys = ["weeks", "days", "hours", "minutes", "seconds"]
- regex = "".join(["((?P<%s>\d+)%s ?)?" % (k, k[0]) for k in keys])
- kwargs = {}
- for k,v in re.match(regex, input).groupdict(default="0").items():
- kwargs[k] = int(v)
- return int(timedelta(**kwargs).total_seconds())
- @app.route('/', methods=['GET'])
- def index():
- return render_template('index.html')
- @app.route('/', defaults={'ttl': 3600, 'filename': None, 'isttl': False, 'isfilename': False}, methods=['PUT'])
- @app.route('/<filename>', defaults={'ttl': None, 'isttl': False, 'isfilename': True}, methods=['PUT'])
- @app.route('/<ttl>/<filename>', defaults={'isttl': True, 'isfilename': True}, methods=['PUT'])
- def upload(ttl, filename, isttl, isfilename):
- if isttl and ttl.isdigit():
- if int(ttl) > MAX_TTL or int(ttl) < 1:
- ttl = MAX_TTL
- else:
- ttl = int(ttl)
- elif isttl and not ttl.isdigit():
- if tdelta(ttl) > MAX_TTL or tdelta(ttl) < 1:
- ttl = DEFAULT_TTL
- else:
- ttl = tdelta(ttl)
- if isfilename:
- filename = secure_filename(filename)
- else:
- filename = 'file.dat'
- if len(request.data) > UPLOAD_SIZE:
- return 'File too large', 422
- else:
- key = ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.ascii_lowercase) for _ in range(6))
- r.set(key, filename, ttl)
- with open(UPLOAD_DIR + key, 'wb') as f:
- f.write(request.data)
- return 'https://files.re/' + key + '/' + filename + '\n'
- @app.route('/<file>', defaults={'filename': None}, methods=['GET'])
- @app.route('/<file>/<filename>', methods=['GET'])
- def download(file, filename):
- if filename == None:
- filename = r.get(file)
- else:
- filename = secure_filename(filename)
- if r.get(file) is not None:
- file = secure_filename(file)
- return send_from_directory(directory=UPLOAD_DIR, filename=file, as_attachment=True, attachment_filename=filename)
- else:
- return 'Not found', 404
- @app.route('/view/<file>', methods=['GET'])
- def view(file):
- if r.get(file) is not None:
- file = secure_filename(file)
- return send_from_directory(directory=UPLOAD_DIR, filename=file, mimetype="text/plain")
- else:
- return 'Not found', 404
- @app.route('/ttl/<file>', methods=['GET'])
- def ttl(file):
- ttl = r.ttl(file);
- if ttl is not None:
- return str(ttl)
- else:
- return 'Not found', 404
- if __name__ == "__main__":
- app.run()
|