oss.py 1.7 KB

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