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