浏览代码

feat: aliyun对象存储

SongZihuan 3 年之前
父节点
当前提交
9d92b1e22f

+ 25 - 0
aliyun/__init__.py

@@ -0,0 +1,25 @@
+from configure import conf
+import oss2
+
+
+class Aliyun:
+    def __init__(self, key, secret, endpoint, name):
+        self.key = key
+        self.secret = secret
+        self.auth = oss2.Auth(key, secret)
+        self.bucket = oss2.Bucket(self.auth, endpoint, name)
+
+    def upload_file(self, name, f):
+        self.bucket.put_object(name, f)
+
+    def shared_obj(self, name, time=15):
+        return self.bucket.sign_url('GET', name, time, slash_safe=True)
+
+
+if conf["aliyun"]:
+    aliyun = Aliyun(conf["aliyun-key"],
+                    conf["aliyun-secret"],
+                    conf["aliyun-bucket-endpoint"],
+                    conf["aliyun-bucket-name"])
+else:
+    aliyun = None

+ 11 - 1
configure/__init__.py

@@ -45,4 +45,14 @@ conf["about-me-project"] = _conf["info"]["project"]
 conf["about-me-skill"] = _conf["info"]["skill"]
 conf["about-me-read"] = _conf["info"]["read"]
 
-conf["foot-info"] = _conf["info"]["foot-info"]
+conf["foot-info"] = f'{_conf["info"]["foot-info"]} Power by HBlog'
+
+aliyun = _conf.get("aliyun")
+if aliyun is None:
+    conf["aliyun"] = False
+else:
+    conf["aliyun"] = True
+    conf["aliyun-key"] = aliyun["Key"]
+    conf["aliyun-secret"] = aliyun["Secret"]
+    conf["aliyun-bucket-endpoint"] = aliyun["Bucket-Endpoint"]
+    conf["aliyun-bucket-name"] = aliyun["Bucket-Name"]

二进制
requirements.txt


二进制
static/images/hello.jpg


+ 0 - 4
static/styles/index/hello.css

@@ -1,7 +1,3 @@
-body {
-    background-image: url("../../images/hello.jpg");
-}
-
 #base {
     position: relative;
 }

+ 6 - 0
static/styles/oss/upload.css

@@ -0,0 +1,6 @@
+.upload-form {
+    background-color: white;
+    border-radius: 10px;
+    border: 2px solid #6b6882;
+    padding: 15px;
+}

+ 1 - 0
templates/auth/yours.html

@@ -44,6 +44,7 @@
                     {% endif %}
                     {% if current_user.check_role('ConfigureSystem') %}
                         <a class="card-link" href="{{ url_for('auth.role_page') }}"> 角色设置 </a>
+                        <a class="card-link" href="{{ url_for('oss.upload_page') }}"> 上传文件 </a>
                     {% endif %}
                 </div>
             </div>

+ 1 - 0
templates/index/hello.html

@@ -7,6 +7,7 @@
     <link href="{{ url_for('static', filename='styles/index/hello.css') }}" rel="stylesheet">
     <style>
         body {
+            background-image: url("{{ url_for('oss.get_page', name="bg-img.jpg") }}");
             overflow-y: hidden;
             overflow-x: hidden;
         }

+ 28 - 0
templates/oss/upload.html

@@ -0,0 +1,28 @@
+{% extends "base.html" %}
+
+{% block title %} 上传文件 {% endblock %}
+
+{% block style %}
+    {{ super() }}
+    <link href="{{ url_for('static', filename='styles/oss/upload.css') }}" rel="stylesheet">
+{% endblock %}
+
+{% block context %}
+    <section id="base" class="container mt-3">
+    <div class="row">
+        <div class="col-12 col-lg-6 offset-lg-3">
+            <form method="post" action="#" class="upload-form" enctype="multipart/form-data">
+                {{ UploadForm.hidden_tag() }}
+
+                <div class="form-group pb-2">
+                    {{ UploadForm.file(class="form-control") }}
+                </div>
+
+                <div class="text-right">
+                    {{ UploadForm.submit(class='btn btn-info mr-2') }}
+                </div>
+            </form>
+        </div>
+    </div>
+    </section>
+{% endblock %}

+ 2 - 1
view/__init__.py

@@ -4,8 +4,9 @@ from view.archive import ArchiveApp
 from view.msg import MsgApp
 from view.about_me import AboutMeApp
 from view.auth import AuthApp
+from view.oss import OSSApp
 
 
-class WebApp(IndexApp, DocxApp, ArchiveApp, MsgApp, AboutMeApp, AuthApp):
+class WebApp(IndexApp, DocxApp, ArchiveApp, MsgApp, AboutMeApp, AuthApp, OSSApp):
     def __init__(self, import_name):
         super(WebApp, self).__init__(import_name)

+ 1 - 1
view/auth.py

@@ -1,13 +1,13 @@
 from flask import Flask, Blueprint, render_template, redirect, flash, url_for, request, abort
 from flask_login import login_required, login_user, current_user, logout_user
 from flask_mail import Mail
+from flask_wtf import FlaskForm
 from wtforms import StringField, PasswordField, BooleanField, SubmitField, ValidationError
 from wtforms.validators import DataRequired, Length, EqualTo
 from typing import Optional
 
 from view.base import App
 from core.user import User, load_user_by_email
-from flask_wtf import FlaskForm
 from send_email import send_msg
 
 auth = Blueprint("auth", __name__)

+ 54 - 0
view/oss.py

@@ -0,0 +1,54 @@
+from flask import Flask, Blueprint, redirect, render_template, request, abort, flash, url_for
+from flask_login import login_required, current_user
+from typing import Optional
+from flask_wtf import FlaskForm
+from wtforms import FileField, SubmitField
+from wtforms.validators import DataRequired
+
+from aliyun import aliyun
+from view.base import App
+
+oss = Blueprint("oss", __name__)
+app: Optional[Flask] = None
+
+
+class UploadForm(FlaskForm):
+    file = FileField("选择文件", validators=[DataRequired()])
+    submit = SubmitField("上传")
+
+
+@oss.before_request
+def check_aliyun():
+    if aliyun is None:
+        abort(404)
+        return
+
+
+@oss.route('get/<string:name>')
+def get_page(name: str):
+    return redirect(aliyun.shared_obj(name))
+
+
+@oss.route('upload', methods=["GET", "POST"])
+@login_required
+def upload_page():
+    if not current_user.check_role("ConfigureSystem"):
+        abort(403)
+        return
+
+    form = UploadForm()
+    if form.validate_on_submit():
+        file = request.files["file"]
+        aliyun.upload_file(file.filename, file)
+        flash(f"文件 {file.filename} 已上传: {url_for('oss.get_page', name=file.filename, _external=True)}")
+        return redirect(url_for("oss.upload_page"))
+    return render_template("oss/upload.html", UploadForm=form)
+
+
+class OSSApp(App):
+    def __init__(self, import_name):
+        super(OSSApp, self).__init__(import_name)
+
+        global app
+        app = self._app
+        app.register_blueprint(oss, url_prefix="/oss")