Skip to content

Commit 468651b

Browse files
committed
feat: 改建文件上传
1 parent 363ed50 commit 468651b

5 files changed

Lines changed: 55 additions & 23 deletions

File tree

app/api/cms/file.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,8 @@
22
:copyright: © 2019 by the Lin team.
33
:license: MIT, see LICENSE for more details.
44
"""
5-
from flask import request
5+
from flask import request, jsonify
66
from lin import login_required
7-
from lin.exception import Success
87
from lin.redprint import Redprint
98

109
from app.extensions.file.local_uploader import LocalUploader
@@ -17,5 +16,5 @@
1716
def post_file():
1817
files = request.files
1918
uploader = LocalUploader(files)
20-
uploader.upload()
21-
return Success()
19+
ret = uploader.upload()
20+
return jsonify(ret)

app/api/cms/user.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
:copyright: © 2019 by the Lin team.
55
:license: MIT, see LICENSE for more details.
66
"""
7+
from collections import namedtuple
78
from operator import and_
89

9-
from flask import jsonify
10+
from flask import jsonify, request, url_for
1011
from flask_jwt_extended import create_access_token, get_jwt_identity, get_current_user, \
1112
create_refresh_token, verify_jwt_refresh_token_in_request
1213
from lin.core import manager, route_meta, Log
@@ -16,8 +17,10 @@
1617
from lin.log import Logger
1718
from lin.redprint import Redprint
1819

20+
from app.extensions.file.local_uploader import LocalUploader
1921
from app.libs.error_code import RefreshException
20-
from app.validators.forms import LoginForm, RegisterForm, ChangePasswordForm, UpdateInfoForm
22+
from app.validators.forms import LoginForm, RegisterForm, ChangePasswordForm, UpdateInfoForm, \
23+
AvatarUpdateForm
2124

2225
user_api = Redprint('user')
2326

@@ -136,6 +139,16 @@ def get_allowed_apis():
136139
return jsonify(user)
137140

138141

142+
@user_api.route('/avatar', methods=['PUT'])
143+
@login_required
144+
def set_avatar():
145+
form = AvatarUpdateForm().validate_for_api()
146+
user = get_current_user()
147+
with db.auto_commit():
148+
user.avatar = form.avatar.data
149+
return Success(msg='操作成功')
150+
151+
139152
def _register_user(form: RegisterForm):
140153
with db.auto_commit():
141154
# 注意:此处使用挂载到manager上的user_model,不可使用默认的User

app/app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ def create_tables(app):
2626

2727

2828
def create_app(register_all=True):
29-
app = Flask(__name__)
29+
app = Flask(__name__, static_folder='./assets')
3030
app.config.from_object('app.config.setting')
3131
app.config.from_object('app.config.secure')
3232
if register_all:
Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import os
2-
1+
from flask import current_app
32
from werkzeug.utils import secure_filename
43

54
from lin.core import File
@@ -9,19 +8,34 @@
98
class LocalUploader(Uploader):
109

1110
def upload(self, **kwargs):
12-
ret = dict(file_storage=self._file_storage, file=[])
11+
ret = []
12+
site_domain = current_app.config.get('SITE_DOMAIN')\
13+
if current_app.config.get('SITE_DOMAIN') else '127.0.0.1:5000'
1314
for single in self._file_storage:
14-
secure_filename(single.filename)
15-
name = self._generate_uuid() + self._get_ext(single)
16-
full_path = os.path.join(self._store_dir, name)
17-
single.save(full_path)
18-
file = File.create_file(
19-
name=name,
20-
path=full_path,
21-
_type=1,
22-
extension=self._get_ext(single),
23-
size=self._get_size(single),
24-
commit=True
25-
)
26-
ret['file'].append(file)
15+
file_md5 = self._generate_md5(single.read())
16+
single.seek(0)
17+
exists = File.query.filter_by(md5=file_md5).first()
18+
if exists:
19+
ret.append({
20+
"key": single.filename,
21+
"id": exists.id,
22+
"url": site_domain + '/assets/' + exists.path
23+
})
24+
else:
25+
absolute_path, relative_path, real_name = self._get_store_path(single.filename)
26+
secure_filename(single.filename)
27+
single.save(absolute_path)
28+
file = File.create_file(
29+
name=real_name,
30+
path=relative_path,
31+
extension=self._get_ext(single.filename),
32+
size=self._get_size(single),
33+
md5=file_md5,
34+
commit=True
35+
)
36+
ret.append({
37+
"key": single.filename,
38+
"id": file.id,
39+
"url": site_domain + '/assets/' + file.path
40+
})
2741
return ret

app/validators/forms.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,12 @@ class UpdateUserInfoForm(Form):
141141
])
142142

143143

144+
class AvatarUpdateForm(Form):
145+
avatar = StringField('头像', validators=[
146+
DataRequired(message='请输入头像url')
147+
])
148+
149+
144150
class BookSearchForm(Form):
145151
q = StringField(validators=[DataRequired(message='必须传入搜索关键字')]) # 前端的请求参数中必须携带`q`
146152

0 commit comments

Comments
 (0)