私有云盘Nextcloud在线解压开发(瞎搞瞎搞0.0)

news2025/1/22 12:43:14

私有云盘 Nextcloud在线解压开发

缘由:
问:为啥百度网盘会员人家可以在线解压哇???
我:what?那必须安排哇!!!

  1. python代码如下
from flask import Flask, request, jsonify, abort
from flask_cors import CORS
import sys
import os
import zipfile
import hashlib
import subprocess
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
app = Flask(__name__)
#跨域,允许所有
CORS(app)

def Shell_cmd():
        xhel = "chown -R 33.tape /home/nextcloud/data/admin/files"    #nextcloud文件目录赋权限
        Cmd_run = subprocess.run(xhel,shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode("utf-8")
        return Cmd_run


def extract_zip_filename(file_path):
    file_name = os.path.basename(file_path)  # 获取文件名,包含扩展名
    if file_name.endswith('.zip'):
        zip_name = file_name[:-4]  # 去掉末尾的'.zip'扩展名
        return zip_name
    else:
        return None  # 如果文件不是.zip文件,返回None或者适当的错误信息


def unzip_file(file_path, extract_path):
    try:
      with zipfile.ZipFile(file_path, 'r') as zip_ref:
        for member in zip_ref.infolist():
            member.filename = member.filename.encode('cp437').decode('gbk')
            zip_ref.extract(member, extract_path)
    except:
        print("111")

def main(zip_file_path):
   try:
    folder_name = os.path.splitext(os.path.basename(zip_file_path))[0]
    extract_path = os.path.join(os.path.dirname(zip_file_path), folder_name)

    unzip_file(zip_file_path, extract_path)
   except:
       print(222)


def find_zip_files(directory):
    result = {}  # 存储结果的字典

    for root, dirs, files in os.walk(directory):
        for folder in dirs:  # 遍历所有文件夹
            folder_path = os.path.join(root, folder)
            zip_files = []  # 存储该文件夹内的zip文件路径
            for file in os.listdir(folder_path):  # 遍历文件夹内的文件
                file_path = os.path.join(folder_path, file)
                if file.endswith('.zip'):  # 判断是否为zip文件
                    zip_files.append(file_path)
            if zip_files:  # 如果文件夹内有zip文件,则将其添加到结果字典中
                result[folder] = zip_files
    return result



@app.route('/unzip', methods=['POST'])
def unzip():
    # 获取 POST 请求的 json 数据
    data = request.get_json()
    mulu_name = data.get('mulu')
    path_name = data.get('path')
    Authentication  = data.get('authentication')
    print(data)
    if mulu_name is not None and path_name is not None:
        if Authentication == "7a1b805e3ffd55luozi":
             zip_file_path = f"{path_name}"
             main(zip_file_path)
             file_path = extract_zip_filename(zip_file_path)
             Shell_cmd()
             return jsonify(file_path)

@app.route('/update', methods=['POST'])
def update():
    # 获取 POST 请求的 json 数据
    data = request.get_json()
    Authentication  = data.get('authentication')
    if Authentication == "705e3ffd55luozi":
        directory = '/home/nextcloud/data/admin/files/'  # 替换为你的目标路径
        result_dict = find_zip_files(directory)
        return jsonify(result_dict)


if __name__ == '__main__':
    app.run(debug=True,host='0.0.0.0',port=6080)

  1. html 代码
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <title>Nextcloud 解压</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    body {
      font-family: Arial, sans-serif;
      background-color: #f4f4f4;
    }

    h1 {
      text-align: center;
      margin-top: 50px;
      font-size: 36px;
      font-weight: bold;
    }

    form {
      width: 80%;
      max-width: 600px;
      margin: 50px auto;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      background-color: #fff;
      /* background-color: #f4f4f4; */
      border-radius: 10px;
      padding: 30px;
      box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
    }

    label {
      font-size: 18px;
      font-weight: bold;
      margin-bottom: 10px;
    }

    select {
      width: 100%;
      height: 40px;
      border-radius: 5px;
      background-color: #f4f4f4;
      border: none;
      outline: none;
      font-size: 16px;
      margin-bottom: 20px;
    }

    button {
      width: 180px;
      height: 50px;
      font-size: 18px;
      font-weight: bold;
      background-color: #007aff;
      color: #fff;
      border: none;
      border-radius: 5px;
      cursor: pointer;
      transition: all 0.2s ease-in-out;
      box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.1), 0px 4px 10px rgba(0, 0, 0, 0.05);
    }

    button:hover {
      background-color: #0065cc;
    }


    .combobox-container {
  position: relative;
  width: 100%;
      height: 40px;
      border-radius: 5px;
      background-color: #f4f4f4;
      border: none;
      outline: none;
      font-size: 16px;
      margin-bottom: 20px;
}

.combobox-input {

  width: 100%;
  height: 40px;
  border-radius: 5px;
  padding: 0.375rem 0.75rem;
  background-color: #f4f4f4;
  font-size: 1rem;
  border: 1px solid #f4f4f4;
  border-radius: 0.25rem;
  -webkit-appearance: none;
     -moz-appearance: none;
          appearance: none;
}

.combobox-options {
  display: none;
  position: absolute;
  top: calc(100% + 1px);
  left: 0;
  z-index: 9999;
  width: 100%;
  max-height: 200px;
  overflow: auto;
  background-color: #f4f4f4;
  border: 1px solid #f4f4f4;
  border-top: none;
  border-bottom-right-radius: 0.25rem;
  border-bottom-left-radius: 0.25rem;
}

.combobox-options div {
  padding: 0.375rem 0.75rem;
  cursor: pointer;
}

.combobox-options div:hover {
  background-color: #f4f4f4;
}
/* 历史日志 */
#text-box {
    position: fixed;
    top: 10%;
    height: 50%;
    right: 0.5%;
    padding: 10px;
    background-color: #f4f4f4;
    box-shadow: 0 0 5px  #231f47;
}

/* #text-box textarea {
    width: 100%;
    height: 100%;
    background-color: #f4f4f4;
    border: none;
    resize: none;
} */
  </style>
  <script src="cdn.bootcdn.net_ajax_libs_jquery_3.6.0_jquery.min.js"></script>
</head>

<body>
  <h1>Nextcloud 解压</h1>

  <!-- <select id="parentSelect" οnchange="updateChildOptions()">
    <option value="">请选择父框</option>
  </select> -->
  <!-- <select id="childSelect">
    <option value="">请选择子框</option>
  </select> -->

  <form>
    <label for="project">文件夹:</label>
    <select id="parentSelect" class="combobox-container" onchange="updateChildOptions()">
      <option value="">文件夹</option>
    </select>



    <label for="environment">ZIP包名:</label>
    <select id="childSelect" class="combobox-container">
      <option value="">ZIP包名:</option>
    </select>

    <div style="width:100%; display:flex; justify-content: center;">
      <!-- 调用deploy()函数 -->
      <button type="button" onclick="deploy()">确认</button>
        </div>

  <p  rows="10" cols="50" readonly  style="margin-left:30px;width: 400px; height: 95%; " >
  解压完毕,需要在你的zip包路径下,创建一个相同的文件夹名字(及完成之后提示的名字)
  </p>

  </form>


  <script>
             // 更新父框选项
      function updateParentOptions(data) {
        var parentSelect = document.getElementById('parentSelect');

        for (var key in data) {
          if (data.hasOwnProperty(key)) {
            var option = document.createElement('option');
            option.value = key;
            option.text = key;
            parentSelect.appendChild(option);
          }
        }
      }

      // 更新子框选项
      function updateChildOptions() {
        var parentSelect = document.getElementById('parentSelect');
        var childSelect = document.getElementById('childSelect');

        var selectedParent = parentSelect.value;
        childSelect.innerHTML = ''; // 清空子框选项

        if (selectedParent && data.hasOwnProperty(selectedParent)) {
          var childOptions = data[selectedParent];

          for (var i = 0; i < childOptions.length; i++) {
            var option = document.createElement('option');
            option.value = childOptions[i];
            option.text = childOptions[i];
            childSelect.appendChild(option);
          }
        }
      }


    // 发布
    function deploy() {
      alert('处理中......');
      var project = $('#parentSelect').val();
      var environment = $('#childSelect').val();
      if (project == '') {
        alert('请选择要目录');
        return;
      }
      if (environment == '') {
        alert('请选择zip包名');
        return;
      }
      const  data = {
          mulu: project,
          path: environment,
          authentication: "7a87edec6bfbba4a1b805e3ffd55luozi"
        };
      $.ajax({
        type: 'POST',
        url: 'https://www.test.com:66/pi/unzip',
        contentType: 'application/json',
        data: JSON.stringify(data),
        xhrFields: {
          withCredentials: true
          },
        rejectUnauthorized: false,
        success: function(data_res) {
          var data = data_res
          console.log(data)
          alert('解压成功请创建目录:' + data);
        },
        error: function(xhr, status, error) {
          if (xhr.status === 403) {
            alert('参数错误');
          } else if (xhr.status === 401) {
            alert('镜像同步失败');
          } else {
          alert('解压失败');
        }
      }
      });
    }

         // 发送Ajax请求
         function update() {
        // alert('处理中......');
        const data2 = {
          authentication: "7a87edec6bfbba4a1b805e3ffd55luozi"
        };

        $.ajax({
          type: 'POST',
          url: 'https://www.test.com:66/update',
          contentType: 'application/json',
          data: JSON.stringify(data2),
          xhrFields: {
            withCredentials: true
            },
          rejectUnauthorized: false,
          success: function(responseData) {
            // alert('更新成功');dd
            var data = responseData;  // 将返回的JSON字符串解析为JavaScript对象
            // 使用responseData进行进一步操作,例如读取其中的键值对
            updateParentOptions(data);
            window.data = data;
            console.log(data.key1);
            console.log(data.key2);
          },
          error: function(xhr, status, error) {
            if (xhr.status === 403) {
              alert('参数错误');
            } else if (xhr.status === 400) {
              alert('写文件失败');
            } else {
              alert('更新失败');
            }
          }
        });
      }

      update(); // 发送ajax请求

  </script>
</body>

</html>

  1. nignx配置
...
      location  /api/ {
      proxy_buffering off;
      proxy_set_header Host $http_host;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Referer "https://192.168.2.200";
      proxy_pass http://192.168.2.200:6080/;
}

...
  location  /unzip/ {
  index  index.html index.htm;
    alias   /data/unzip/;
}
...

  1. 效果展示
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/966355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

个微机器人开发接口

请求URL&#xff1a; http://域名地址/member/login域名地址开发者账号密码:后台系统自助开通 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/json 参数&#xff1a; 参数名必选类型说明account是string开发者账号password…

Centos 7 通过Docker部署OnlyOffice

前言&#xff1a; 在本文中&#xff0c;我们将详细介绍如何使用 Docker 部署功能强大的协作办公套件 OnlyOffice。通过 Docker&#xff0c;您可以轻松构建、部署和管理 OnlyOffice&#xff0c;从而提高团队协作和企业办公的效率。 一、安装Docker 1、向系统添加Docker CE软件仓…

Python小知识 - 1. Python装饰器(decorator)

Python装饰器&#xff08;decorator&#xff09; Python装饰器是一个很有用的功能&#xff0c;它可以让我们在不修改原有代码的情况下&#xff0c;为已有的函数或类添加额外的功能。 常见的使用场景有&#xff1a; a. 函数缓存&#xff1a;对于一些计算量较大的函数&#xff0c…

【小沐学NLP】Python使用NLTK库进行分词

文章目录 1、简介2、安装2.1 安装nltk库2.2 安装nltk语料库 3、测试3.1 分句分词3.2 停用词过滤3.3 词干提取3.4 词形/词干还原3.5 同义词与反义词3.6 语义相关性3.7 词性标注3.8 Text对象 结语 1、简介 NLTK - 自然语言工具包 - 是一套开源Python。 支持自然研究和开发的模块…

Android GB28181客户端开发(1):GB28181协议简介

Android GB28181客户端开发(1):GB28181协议简介 公共安全视频监控联网系统信息传输、交换、控制技术要求(2016版) 源码请翻到文章结尾 介绍GB28181协议 GB28181协议是一种基于IP网络的远程视频监控系统,它定义了设备之间的通信协议和数据格式。GB28181协议的主要特点是支…

YOLOv5算法改进(14)— 更换Neck之BiFPN

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。BiFPN &#xff08; Bidirectional Feature Pyramid Network &#xff09;是一种加权双向&#xff08;自顶向下 自底向上&#xff09;特征金字塔网络&#xff0c;是目标检测中神经网络架构设计的选择之一&#xff0c;是为…

【易售小程序项目】小程序首页完善(滑到底部数据翻页、回到顶端、基于回溯算法的两列数据高宽比平衡)【后端基于若依管理系统开发】

文章目录 说明细节一&#xff1a;首页滑动到底部&#xff0c;需要查询下一页的商品界面预览页面实现 细节二&#xff1a;当页面滑动到下方&#xff0c;出现一个回到顶端的悬浮按钮细节三&#xff1a;商品分列说明优化前后效果对比使用回溯算法实现ControllerService回溯算法 优…

气象站在日常生活中的重要性

气象站在我们的日常生活中起着重要的作用&#xff0c;它监测着天气的变化&#xff0c;能够提供及时、准确的天气信息&#xff0c;对我们的生产和生活都有着极大的影响。 一、气象站的工作原理 气象站通过一系列传感器设备&#xff0c;对风速、风向、温度、湿度、气压、雨量等…

华为数通方向HCIP-DataCom H12-821题库(单选题:241-261)

第241题 ​​LS Request​​报文不包括以下哪一字段? A、通告路由器(Advertising Router) B、链路状态 ID (Link Srate ID) C、数据库描述序列号(Database Dascription Sequence lumber) D、链路状态类型 Link state type) 答案:C 解析: LS Request 报文中包括以下字段…

将qt6编写的简单小程序烧录Android手机中,以及编译生成apk位置

准备工作 1、一个qt能够编译通过的简单工程。参考&#xff1a;https://www.bilibili.com/video/BV1tp4y1i7EJ?p15 2、配置好QT6的Android环境&#xff0c;(JDK,SDK,NDK等)&#xff0c;可参考&#xff1a;https://mar-sky.blog.csdn.net/article/details/132630567 3、一台闲置…

【计算机硬件CPU】

【计算机硬件CPU】 1、计算机硬件的五大单元2、一切设计的起点&#xff1a; CPU 的架构3、精简指令集 &#xff08;Reduced Instruction Set Computer, RISC&#xff09;4、复杂指令集&#xff08;Complex Instruction Set Computer, CISC&#xff09;5、例题&#xff1a;最新的…

Spring boot 第一个程序

新建工程 选择spring-boot版本 右键创建类TestController&#xff1a; 代码如下&#xff1a; package com.example.demo; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springf…

面经:安卓学习笔记

文章目录 1. Android系统架构2. Activity2.0 定义2.1 生命周期2.2 生命状态2.3 启动模式 3. Service3.1 定义3.2 两种启动方式3.3 生命周期3.4 跨进程service3.5 IntentService 4. BroadCastReceiver4.1 概念4.2 组成4.3 广播接收器的分类4.4 生命周期4.5 静态注册和动态注册 5…

一个.NET 7 + DDD + CQRS +React+Vite的实战项目

项目简介 基于SignalR实现聊天通信&#xff0c;支持横向扩展&#xff0c;可支撑上万用户同时在线聊天 快速体验 http://server.tokengo.top:8888/ 可在这里快速体验使用&#xff0c;请注意目前只适配了PC端&#xff0c;请勿使用手机访问&#xff0c;可能出现样式不适应的情况…

向量数据库Annoy和Milvus

Annoy 和 Milvus 都是用于向量索引和相似度搜索的开源库&#xff0c;它们可以高效地处理大规模的向量数据。 Annoy&#xff08;Approximate Nearest Neighbors Oh Yeah&#xff09;&#xff1a; Annoy 是一种近似最近邻搜索算法&#xff0c;它通过构建一个树状结构来加速最近…

CSS中如何实现文字描边效果(Text Stroke)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 文字描边效果&#xff08;Text Stroke&#xff09;⭐ 示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个…

zookeeper 集群

zookeeper 集群 1、zookeeper 集群说明 initLimit 是Zookeeper用它来限定集群中的Zookeeper服务器连接到Leader的时限 syncLimit 限制了follower服务器与leader服务器之间请求和应答之间的时限 服务器名称与地址&#xff1a;集群信息&#xff08;服务器编号&#xff0c;服务器…

【Java 基础篇】Java 面向对象详解:面向对象编程的艺术

如果你正在学习Java编程&#xff0c;面向对象编程&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一个不可或缺的概念。Java是一种面向对象的编程语言&#xff0c;这意味着它的编程范式基于对象、类和继承。在本篇博客中&#xff0c;我们将深入探讨Java…

IIR滤波器算法

IIR&#xff08;Infinite Impulse Response&#xff09;滤波器是一类递归型数字滤波器&#xff0c;其输出信号不仅与当前的输入信号有关&#xff0c;还与之前的输入和输出信号有关。因此&#xff0c;IIR滤波器的阶数相对较低&#xff0c;可以实现更为复杂的频率响应。 IIR滤波…

C++包含整数各位重组

void 包含整数各位重组() {//缘由https://bbs.csdn.net/topics/395402016int shu 100000, bs 4, bi shu * bs, a 0, p 0, d 0;while (shu < 500000)if (a<6 && (p to_string(shu).find(to_string(bi)[a], p)) ! string::npos && (d to_string(bi…