app.py 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import redis, os, random, string, re
  2. from datetime import timedelta
  3. from flask import Flask, request, render_template, send_from_directory
  4. from werkzeug.utils import secure_filename
  5. r = redis.Redis('localhost')
  6. app = Flask(__name__)
  7. DEFAULT_TTL = 86400
  8. MAX_TTL = 259200
  9. UPLOAD_DIR = '/storage/'
  10. UPLOAD_SIZE = 200 * 1024 * 1024
  11. def tdelta(input):
  12. keys = ["weeks", "days", "hours", "minutes", "seconds"]
  13. regex = "".join(["((?P<%s>\d+)%s ?)?" % (k, k[0]) for k in keys])
  14. kwargs = {}
  15. for k,v in re.match(regex, input).groupdict(default="0").items():
  16. kwargs[k] = int(v)
  17. return int(timedelta(**kwargs).total_seconds())
  18. @app.route('/', methods=['GET'])
  19. def index():
  20. return render_template('index.html')
  21. @app.route('/', defaults={'ttl': 3600, 'filename': None, 'isttl': False, 'isfilename': False}, methods=['PUT'])
  22. @app.route('/<filename>', defaults={'ttl': None, 'isttl': False, 'isfilename': True}, methods=['PUT'])
  23. @app.route('/<ttl>/<filename>', defaults={'isttl': True, 'isfilename': True}, methods=['PUT'])
  24. def upload(ttl, filename, isttl, isfilename):
  25. if isttl and ttl.isdigit():
  26. if int(ttl) > MAX_TTL or int(ttl) < 1:
  27. ttl = MAX_TTL
  28. else:
  29. ttl = int(ttl)
  30. elif isttl and not ttl.isdigit():
  31. if tdelta(ttl) > MAX_TTL or tdelta(ttl) < 1:
  32. ttl = DEFAULT_TTL
  33. else:
  34. ttl = tdelta(ttl)
  35. if isfilename:
  36. filename = secure_filename(filename)
  37. else:
  38. filename = 'file.dat'
  39. if len(request.data) > UPLOAD_SIZE:
  40. return 'File too large', 422
  41. else:
  42. key = ''.join(random.SystemRandom().choice(string.ascii_uppercase + string.ascii_lowercase) for _ in range(6))
  43. r.set(key, filename, ttl)
  44. with open(UPLOAD_DIR + key, 'wb') as f:
  45. f.write(request.data)
  46. return 'https://files.re/' + key + '/' + filename + '\n'
  47. @app.route('/<file>', defaults={'filename': None}, methods=['GET'])
  48. @app.route('/<file>/<filename>', methods=['GET'])
  49. def download(file, filename):
  50. if filename == None:
  51. filename = r.get(file)
  52. else:
  53. filename = secure_filename(filename)
  54. if r.get(file) is not None:
  55. file = secure_filename(file)
  56. return send_from_directory(directory=UPLOAD_DIR, filename=file, as_attachment=True, attachment_filename=filename)
  57. else:
  58. return 'Not found', 404
  59. @app.route('/view/<file>', methods=['GET'])
  60. def view(file):
  61. if r.get(file) is not None:
  62. file = secure_filename(file)
  63. return send_from_directory(directory=UPLOAD_DIR, filename=file, mimetype="text/plain")
  64. else:
  65. return 'Not found', 404
  66. @app.route('/ttl/<file>', methods=['GET'])
  67. def ttl(file):
  68. ttl = r.ttl(file);
  69. if ttl is not None:
  70. return str(ttl)
  71. else:
  72. return 'Not found', 404
  73. if __name__ == "__main__":
  74. app.run()