· 4 years ago · Mar 11, 2021, 08:42 AM
1import os
2from datetime import datetime
3import uuid
4from flask import request
5from flask import jsonify
6from sqlalchemy.exc import IntegrityError
7from heya.app import app
8from heya.app import db
9from heya.models import Messages
10from heya.models import Files
11from heya.utilities import *
12from heya.errors import error_response
13
14@app.route('/api/upload', methods=['POST'])
15def upload_file():
16 from PIL import Image
17
18 # check for erros
19 user = who_am_i()
20 if user is None:
21 return error_response('login', 'not-logged-in')
22 if not 'file' in request.files:
23 return error_response('files','no-file-uploaded')
24 if request.files['file'].filename == "":
25 return error_response('files','no-file-uploaded')
26
27 received_file = request.files['file']
28
29 # check file type
30 dot = received_file.filename.rfind('.')
31 extension = received_file.filename[dot:].lower()
32 if not extension in ('.txt', '.pdf', '.png', '.jpg', '.jpeg', '.gif'):
33 return error_response('files','unsupported-file-type')
34
35 # create space folder if not exists
36 space_upload_folder = os.path.join(app.config['UPLOAD_FOLDER'], request.form['space'])
37 if not os.path.exists(space_upload_folder):
38 os.mkdir(space_upload_folder)
39
40 # create unique file id
41 fid = uuid.uuid1()
42 new_filename = str(fid)
43 full_filename_orig = os.path.join(space_upload_folder, new_filename + "_orig" + extension)
44 full_filename_final = os.path.join(space_upload_folder, new_filename + ".png")
45
46 # save original
47 received_file.save(full_filename_orig)
48
49 img = Image.open(full_filename_orig)
50 w,h = img.size
51 w2,h2 = 200, int(200*h/w)
52 img.resize((w2, h2))
53 img.save(full_filename_final, "png")
54
55 try:
56 # Create File object
57 f = Files(
58 localpath=new_filename+".png",
59 uploadUser=user.userid,
60 uploadTime=datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
61 originalFilename=received_file.filename,
62 mimeType=received_file.mimetype,
63 status='ok',
64 width=w2,
65 height=h2
66 )
67
68 # Insert File object to database files table
69 db.session.add(f)
70 db.session.flush()
71
72 # Commit to database
73 db.session.commit()
74 except IntegrityError:
75 db.session.rollback()
76 return error_response('files','upload-error')
77 # Return to user
78 return jsonify({"fileid": f.fileid})
79
80@app.route('/api/file/<fileid>', methods=['GET'])
81def get_file():
82 pass