|
1 | | -from flask import Flask, request, jsonify, render_template |
| 1 | +from flask import Flask, request, jsonify, send_file, send_from_directory |
2 | 2 | from werkzeug.utils import secure_filename |
3 | 3 | import os |
| 4 | +from subprocess import call |
| 5 | +from pathlib import Path |
4 | 6 |
|
5 | 7 |
|
6 | | -UPLOAD_FOLDER = "./uploaded_files" |
7 | | - |
8 | | -if not os.path.exists(UPLOAD_FOLDER): |
9 | | - os.makedirs(UPLOAD_FOLDER) |
10 | | - |
11 | 8 | app = Flask(__name__) |
12 | 9 | app.secret_key = "secret key" |
13 | | -app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER |
14 | | - |
15 | | - |
16 | | -@app.route('/upload', methods=['POST']) |
17 | | -def upload(): |
18 | | - if 'files[]' not in request.files: |
19 | | - resp = jsonify({'message' : 'No file in the request'}) |
20 | | - resp.status_code = 400 |
21 | | - return resp |
22 | | - |
23 | | - files = request.files.getlist('files[]') |
24 | | - |
25 | | - errors = {} |
26 | | - success = False |
27 | | - |
28 | | - for file in files: |
29 | | - if file: |
30 | | - filename = secure_filename(file.filename) |
31 | | - file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) |
32 | | - success = True |
33 | | - |
34 | | - if success and errors: |
35 | | - errors['message'] = 'File(s) successfully uploaded' |
36 | | - resp = jsonify(errors) |
37 | | - resp.status_code = 500 |
38 | | - return resp |
39 | | - if success: |
40 | | - resp = jsonify({'message' : 'Files successfully uploaded'}) |
41 | | - resp.status_code = 201 |
42 | | - return resp |
43 | | - else: |
44 | | - resp = jsonify(errors) |
45 | | - resp.status_code = 500 |
46 | | - return resp |
| 10 | + |
| 11 | +# To upload multiple file. For example, /upload/test?apikey=xyz |
| 12 | +@app.route('/upload/<dir>', methods=['POST']) |
| 13 | +def upload(dir): |
| 14 | + apikey = request.args.get('apikey') |
| 15 | + dirname = dir + "_" + apikey |
| 16 | + |
| 17 | + if 'files[]' not in request.files: |
| 18 | + resp = jsonify({'message': 'No file in the request'}) |
| 19 | + resp.status_code = 400 |
| 20 | + return resp |
| 21 | + |
| 22 | + files = request.files.getlist('files[]') |
| 23 | + |
| 24 | + errors = {} |
| 25 | + success = False |
| 26 | + |
| 27 | + if not os.path.exists(secure_filename(dirname)): |
| 28 | + os.makedirs(secure_filename(dirname)) |
| 29 | + |
| 30 | + for file in files: |
| 31 | + if file: |
| 32 | + filename = secure_filename(file.filename) |
| 33 | + file.save(secure_filename(dirname)+"/"+filename) |
| 34 | + success = True |
| 35 | + |
| 36 | + if success and errors: |
| 37 | + errors['message'] = 'File(s) successfully uploaded' |
| 38 | + resp = jsonify(errors) |
| 39 | + resp.status_code = 500 |
| 40 | + return resp |
| 41 | + if success: |
| 42 | + resp = jsonify({'message': 'Files successfully uploaded'}) |
| 43 | + resp.status_code = 201 |
| 44 | + return resp |
| 45 | + else: |
| 46 | + resp = jsonify(errors) |
| 47 | + resp.status_code = 500 |
| 48 | + return resp |
| 49 | + |
| 50 | +# To execute any python file. For example, /execute/test?apikey=xyz |
| 51 | +@app.route('/execute/<dir>', methods=['POST']) |
| 52 | +def execute(dir): |
| 53 | + apikey = request.args.get('apikey') |
| 54 | + dirname = dir + "_" + apikey |
| 55 | + |
| 56 | + if 'file' not in request.files: |
| 57 | + resp = jsonify({'message': 'No file in the request'}) |
| 58 | + resp.status_code = 400 |
| 59 | + return resp |
| 60 | + |
| 61 | + file = request.files['file'] |
| 62 | + |
| 63 | + if file.filename == '': |
| 64 | + resp = jsonify({'message': 'No file selected for Executing'}) |
| 65 | + resp.status_code = 400 |
| 66 | + return resp |
| 67 | + |
| 68 | + errors = {} |
| 69 | + success = False |
| 70 | + |
| 71 | + if not os.path.exists(secure_filename(dirname)): |
| 72 | + os.makedirs(secure_filename(dirname)) |
| 73 | + |
| 74 | + if file: |
| 75 | + filename = secure_filename(file.filename) |
| 76 | + file.save(secure_filename(dirname)+"/"+filename) |
| 77 | + output_filename = filename + ".out" |
| 78 | + file_path = secure_filename(dirname) + "/"+filename |
| 79 | + outputfile_path = secure_filename(dirname)+"/"+output_filename |
| 80 | + f = open(outputfile_path, "w") |
| 81 | + call(["nohup", "python3", file_path], stdout=f) |
| 82 | + success = True |
| 83 | + |
| 84 | + if success: |
| 85 | + resp = jsonify({'message': 'Files successfully executed'}) |
| 86 | + resp.status_code = 201 |
| 87 | + return resp |
| 88 | + else: |
| 89 | + resp = jsonify(errors) |
| 90 | + resp.status_code = 500 |
| 91 | + return resp |
| 92 | + |
| 93 | + |
| 94 | + |
| 95 | +# to download /download/<dir>?fetch=<downloadfile>. For example, /download/test?fetch=example.py.out&apikey=xyz |
| 96 | +@app.route('/download/<dir>', methods=['POST', 'GET']) |
| 97 | +def download(dir): |
| 98 | + download_file = request.args.get('fetch') |
| 99 | + apikey = request.args.get('apikey') |
| 100 | + dirname = dir + "_" + apikey |
| 101 | + |
| 102 | + if not os.path.exists(secure_filename(dirname)): |
| 103 | + resp = jsonify({'message': 'Directory not found'}) |
| 104 | + resp.status_code = 400 |
| 105 | + return resp |
| 106 | + |
| 107 | + try: |
| 108 | + return send_from_directory(secure_filename(dirname), download_file, as_attachment=True) |
| 109 | + except: |
| 110 | + resp = jsonify({'message': 'file not found'}) |
| 111 | + resp.status_code = 400 |
| 112 | + return resp |
| 113 | + |
47 | 114 |
|
48 | 115 | if __name__ == "__main__": |
49 | 116 | app.run(host="0.0.0.0") |
0 commit comments