oss.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from flask import Blueprint, redirect, render_template, abort, flash, url_for, request
  2. from flask_login import login_required, current_user
  3. from flask_wtf import FlaskForm
  4. from wtforms import FileField, StringField, SubmitField
  5. from wtforms.validators import DataRequired
  6. from aliyun import aliyun
  7. import app
  8. oss = Blueprint("oss", __name__)
  9. class UploadForm(FlaskForm):
  10. file = FileField("选择文件", validators=[DataRequired()])
  11. path = StringField("存储路径")
  12. submit = SubmitField("上传")
  13. @oss.before_request
  14. def check_aliyun():
  15. if aliyun is None:
  16. app.HBlogFlask.print_user_opt_fail_log("aliyun not used")
  17. abort(404)
  18. return
  19. @oss.route('get/<path:name>')
  20. def get_page(name: str):
  21. app.HBlogFlask.print_user_opt_success_log(f"get file {name}")
  22. url = aliyun.shared_obj(name)
  23. if url is None:
  24. abort(404)
  25. return redirect(url)
  26. @oss.route('upload', methods=["GET", "POST"])
  27. @login_required
  28. def upload_page():
  29. if not current_user.check_role("ConfigureSystem"):
  30. app.HBlogFlask.print_user_not_allow_opt_log("upload file")
  31. abort(403)
  32. return
  33. form = UploadForm()
  34. if form.validate_on_submit():
  35. file = request.files["file"]
  36. path: str = form.path.data
  37. if len(path) > 0 and not path.endswith('/'):
  38. path += "/"
  39. path += file.filename
  40. aliyun.upload_file(path, file)
  41. app.HBlogFlask.print_sys_opt_success_log(f"Upload file {path}")
  42. flash(f"文件 {file.filename} 已上传: {url_for('oss.get_page', name=path, _external=True)}")
  43. return redirect(url_for("oss.upload_page"))
  44. app.HBlogFlask.print_load_page_log(f"OSS upload")
  45. return render_template("oss/upload.html", UploadForm=form)