oss.py 2.3 KB

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