浏览代码

feat: OSS支持文件夹管理

SongZihuan 3 年之前
父节点
当前提交
f6ebf5da5e
共有 3 个文件被更改,包括 21 次插入6 次删除
  1. 2 0
      aliyun/__init__.py
  2. 14 6
      app/oss.py
  3. 5 0
      templates/oss/upload.html

+ 2 - 0
aliyun/__init__.py

@@ -27,6 +27,8 @@ class Aliyun:
                          f"version id: {res.versionid} key: {self.key}")
 
     def shared_obj(self, name, time=15):
+        if not self.bucket.object_exists(name):
+            return None
         url = self.bucket.sign_url('GET', name, time, slash_safe=True)
         self.logger.debug(f"Get url {url} name: {name} time: {time}s key: {self.key}")
         return url

+ 14 - 6
app/oss.py

@@ -1,7 +1,7 @@
 from flask import Blueprint, redirect, render_template, abort, flash, url_for, request
 from flask_login import login_required, current_user
 from flask_wtf import FlaskForm
-from wtforms import FileField, SubmitField
+from wtforms import FileField, StringField, SubmitField
 from wtforms.validators import DataRequired
 
 from aliyun import aliyun
@@ -12,6 +12,7 @@ oss = Blueprint("oss", __name__)
 
 class UploadForm(FlaskForm):
     file = FileField("选择文件", validators=[DataRequired()])
+    path = StringField("存储路径")
     submit = SubmitField("上传")
 
 
@@ -23,10 +24,13 @@ def check_aliyun():
         return
 
 
-@oss.route('get/<string:name>')
+@oss.route('get/<path:name>')
 def get_page(name: str):
     app.HBlogFlask.print_user_opt_success_log(f"get file {name}")
-    return redirect(aliyun.shared_obj(name))
+    url = aliyun.shared_obj(name)
+    if url is None:
+        abort(404)
+    return redirect(url)
 
 
 @oss.route('upload', methods=["GET", "POST"])
@@ -40,9 +44,13 @@ def upload_page():
     form = UploadForm()
     if form.validate_on_submit():
         file = request.files["file"]
-        aliyun.upload_file(file.filename, file)
-        app.HBlogFlask.print_sys_opt_success_log(f"Upload file {file.filename}")
-        flash(f"文件 {file.filename} 已上传: {url_for('oss.get_page', name=file.filename, _external=True)}")
+        path: str = form.path.data
+        if len(path) > 0 and not path.endswith('/'):
+            path += "/"
+        path += file.filename
+        aliyun.upload_file(path, file)
+        app.HBlogFlask.print_sys_opt_success_log(f"Upload file {path}")
+        flash(f"文件 {file.filename} 已上传: {url_for('oss.get_page', name=path, _external=True)}")
         return redirect(url_for("oss.upload_page"))
     app.HBlogFlask.print_load_page_log(f"OSS upload")
     return render_template("oss/upload.html", UploadForm=form)

+ 5 - 0
templates/oss/upload.html

@@ -14,6 +14,11 @@
             <form method="post" action="#" class="upload-form" enctype="multipart/form-data">
                 {{ UploadForm.hidden_tag() }}
 
+                <div class="form-group pb-2">
+                    {{ UploadForm.path.label }}
+                    {{ UploadForm.path(class="form-control", value="hblog/") }}
+                </div>
+
                 <div class="form-group pb-2">
                     {{ UploadForm.file(class="form-control") }}
                 </div>