Skip to content

Instantly share code, notes, and snippets.

@vitaly-los
Created October 11, 2018 07:06
Show Gist options
  • Save vitaly-los/05b17bcc994f2e89193cb70ba836e571 to your computer and use it in GitHub Desktop.
Save vitaly-los/05b17bcc994f2e89193cb70ba836e571 to your computer and use it in GitHub Desktop.
import os
import hashlib
import shutil
from flask import Flask, render_template, request, send_from_directory
app = Flask(__name__)
APP_ROOT = os.path.dirname(os.path.abspath(__file__))
# tmp folder
tmp_path = '/'.join([APP_ROOT, 'store', 'tmp'])
if not os.path.isdir(tmp_path):
os.mkdir(tmp_path)
@app.route("/")
def index():
return '''
<a href="/upload">Upload</a></br>
<a href="/download">Download</a></br>
<a href="/delete">Delete</a></br>
'''
@app.route("/upload", methods=['GET', 'POST'])
def upload():
target = os.path.join(APP_ROOT, 'store')
if not os.path.isdir(target):
os.mkdir(target)
if request.method == 'POST':
file = request.files['file']
# Calculating sha256
filename = "/".join([tmp_path, file.filename])
file.save(filename)
hash = get_sha1_hash(filename)
os.remove(filename) # Clean up /tmp
# Generating files path
# Sub path
subfolder = '/'.join([target, hash[0:2]])
if not os.path.isdir(subfolder):
print(subfolder)
os.mkdir(subfolder)
# Full path
filefolder = '/'.join([subfolder, hash])
if not os.path.isdir(filefolder):
os.mkdir(filefolder)
# Saving file (root / subfolder / hashfolder / filname.ext )
file_folder = '/'.join([target, hash[0:2], hash, file.filename])
file.save(file_folder)
return "File uploaded, save this hash %s" % hash
return '''<h1> File uploader </h1>
<form id="upload-form" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" name="send">
</form>'''
@app.route('/delete', methods=['GET', 'POST'])
def delete():
if request.method == 'POST':
hash = request.form.get('hash')
expectedFileFolder = '/'.join([APP_ROOT, 'store', hash[0:2], hash])
# if file exists - delete folder with all files inside
if os.path.isdir(expectedFileFolder):
shutil.rmtree(expectedFileFolder)
return 'File with hash: {} was removed'.format(hash)
return 'File with hash: {} was not found'.format(hash)
return ''' <h1>File eraser</h1>
<form method="POST">
Hash: <input type="txt" name="hash"><br><br>
<input type="submit" value="Submit"><br>
<form/>'''
@app.route('/download', methods=['GET', 'POST'])
def download():
if request.method == 'POST':
hash = request.form.get('hash')
expectedFileFolder = '/'.join([APP_ROOT, 'store', hash[0:2], hash])
if os.path.isdir(expectedFileFolder):
filename = os.listdir(expectedFileFolder)[0]
return send_from_directory(expectedFileFolder, filename, as_attachment=True)
else:
return 'There is no file file with such hash'
return ''' <h1>File downloader</h1>
<form method="POST">
Hash: <input type="text" name="hash"><br><br>
<input type="submit" value="Download"><br>
<form/>'''
def get_sha1_hash(file):
"""
Returns SHA-1 hash of file
"""
buf_size = 65536
h = hashlib.sha1()
with open(file, 'rb') as f:
while True:
data = f.read(buf_size)
if not data:
break
h.update(data)
return h.hexdigest()
if __name__ == "__main__":
app.run(port=4555, debug=True)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment