oss.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from flask import Blueprint, redirect, render_template, abort, flash, url_for, request
  2. from flask_login import login_required
  3. from flask_wtf import FlaskForm
  4. from wtforms import FileField, StringField, SubmitField
  5. from wtforms.validators import DataRequired, Length
  6. import configure
  7. from aliyun import aliyun
  8. import app
  9. oss = Blueprint("oss", __name__)
  10. class UploadForm(FlaskForm):
  11. file = FileField("选择文件", description="待上传文件",
  12. validators=[DataRequired(message="必须选择文件")])
  13. path = StringField("存储文件夹", description="文件路径(不含文件名)",
  14. validators=[Length(-1, 30, message="文件路径长度为30个字符以内")])
  15. submit = SubmitField("上传")
  16. def __init__(self):
  17. super(UploadForm, self).__init__()
  18. self.path.data = "hblog/"
  19. @oss.before_request
  20. def check_aliyun():
  21. if aliyun is None:
  22. app.HBlogFlask.print_user_opt_fail_log("aliyun not used")
  23. abort(404)
  24. return
  25. @oss.route('get/<path:name>')
  26. def get_page(name: str):
  27. app.HBlogFlask.print_user_opt_success_log(f"get file {name}")
  28. url = aliyun.shared_obj(name)
  29. if url is None:
  30. abort(404)
  31. return redirect(url)
  32. @oss.route('upload', methods=["GET", "POST"])
  33. @login_required
  34. @app.role_required("ConfigureSystem", "upload file")
  35. def upload_page():
  36. form = UploadForm()
  37. if form.validate_on_submit():
  38. file = request.files["file"]
  39. path: str = form.path.data
  40. if len(path) > 0 and not path.endswith('/'):
  41. path += "/"
  42. if path.startswith('/'):
  43. path = path[1:]
  44. path += file.filename
  45. aliyun.upload_file(path, file)
  46. app.HBlogFlask.print_sys_opt_success_log(f"Upload file {path}")
  47. flash(f"文件 {file.filename} 已上传: {configure.conf['URL_NAME'] + url_for('oss.get_page', name=path)}")
  48. return redirect(url_for("oss.upload_page"))
  49. app.HBlogFlask.print_load_page_log(f"OSS upload")
  50. return render_template("oss/upload.html", UploadForm=form)