whttpserver:一個命令極速搭建文件上傳與下載服務器

whttpserver 是一個簡單的HTTP服務器,類似于python -m http.server,但增加了文件上傳和編輯的功能。

1. 安裝 whttpserver 模塊
# 臨時設置環境變量 PYTHONUTF8=1,強制 Python 使用 UTF-8 編碼
set PYTHONUTF8=1
pip install whttpserver
2. 啟動服務
whttpserver --port <服務器監聽的端口號,默認為25000> --dir <"文件上傳和下載的根目錄"> --debug <True or False>

啟動信息如下:

在瀏覽器地址欄中,輸入 http://127.0.0.1:8181/

3. 定制模板

可以看到,默認的頁面比較簡陋,我們可以修改下模板文件,讓它看起來更美觀一些。

模板文件路徑為:%python安裝目錄%/Lib/site-packages/whttpserver/templates/index.html

修改后的 index.html 文件內容如下:

<!DOCTYPE html>
<html lang="zh">
<head><title>Directory listing for {{the_path}}</title><style>* {margin: 0;padding: 0;box-sizing: border-box;}body {font-family: "Microsoft YaHei", "微軟雅黑", Arial, sans-serif;background: linear-gradient(135deg, #f5f7fa 0%, #e4edf5 100%);color: #2c3e50;min-height: 100vh;padding: 20px;overflow: hidden; /* 確保整個頁面無滾動條 */display: flex;flex-direction: column;}.header {display: flex;justify-content: space-between;align-items: center;margin-bottom: 25px;padding-bottom: 15px;border-bottom: 1px solid rgba(44, 62, 80, 0.1);}.breadcrumb {display: flex;align-items: center;gap: 8px;font-size: 18px;}.breadcrumb a {color: #3498db;text-decoration: none;transition: all 0.3s ease;padding: 5px 10px;border-radius: 4px;}.breadcrumb a:hover {background: rgba(52, 152, 219, 0.1);transform: translateY(-2px);}.breadcrumb span {color: #7f8c8d;}.upload-section {background: white;border-radius: 12px;padding: 20px;box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);margin-bottom: 25px;}.upload-form {display: flex;gap: 15px;align-items: center;}.file-input {flex: 1;padding: 12px 15px;border: 2px dashed #3498db;border-radius: 8px;background: rgba(52, 152, 219, 0.05);font-size: 16px;cursor: pointer;}.refresh-btn {background: #009688;color: white;border: none;padding: 12px 25px;border-radius: 8px;font-weight: 600;cursor: pointer;transition: all 0.3s ease;box-shadow: 0 4px 10px rgba(52, 152, 219, 0.3);}.upload-btn {background: #3498db;color: white;border: none;padding: 12px 25px;border-radius: 8px;font-weight: 600;cursor: pointer;transition: all 0.3s ease;box-shadow: 0 4px 10px rgba(52, 152, 219, 0.3);}.upload-btn:hover {background: #2980b9;transform: translateY(-2px);box-shadow: 0 6px 15px rgba(52, 152, 219, 0.4);}.messages {margin-top: 15px;padding: 10px;border-radius: 6px;background: rgba(46, 204, 113, 0.1);color: #27ae60;display: none;}.uploading-message {margin-top: 10px;color: #3498db;font-style: italic;}.table-container {background: white;border-radius: 12px;overflow: hidden;box-shadow: 0 4px 20px rgba(0, 0, 0, 0.05);flex: 1;display: flex;flex-direction: column;max-height: calc(100vh - 300px); /* 確保表格高度適應屏幕 */}.table-header {padding: 20px;border-bottom: 1px solid rgba(44, 62, 80, 0.1);}.table-header h3 {font-size: 22px;color: #2c3e50;}.table-scroll {overflow-y: auto;max-height: calc(100vh - 320px); /* 確保表格內容不超出視口 */}/* 隱藏滾動條但保留功能 */.table-scroll::-webkit-scrollbar {width: 0;height: 0;}table {width: 100%;border-collapse: separate;border-spacing: 0;font-size: 15px;}th {background: #f8f9fa;color: #7f8c8d;font-weight: 600;text-align: left;padding: 15px 20px;position: sticky;top: 0;border-bottom: 2px solid #ecf0f1;}td {padding: 12px 20px;border-bottom: 1px solid #ecf0f1;}tr:hover td {background: rgba(236, 240, 241, 0.5);}.file a {color: #27ae60;text-decoration: none;font-weight: 500;transition: all 0.2s ease;}.dir a {color: #3498db;text-decoration: none;font-weight: 500;transition: all 0.2s ease;}.file a:hover, .dir a:hover {text-decoration: underline;opacity: 0.9;}.footer {text-align: center;padding: 20px;color: #7f8c8d;font-size: 14px;margin-top: 20px;border-top: 1px solid rgba(44, 62, 80, 0.1);}</style>
</head>
<body><div class="header"><div class="breadcrumb"><a href="/">根目錄</a><span>?</span><a href="{{ parent_path }}">上一級</a></div><h3><input type="button" value="刷 新" class="refresh-btn" onclick="javascript: location.href = location.href;"></h3><h3>文件目錄管理器</h3></div><div class="upload-section"><form class="upload-form" method="post" action="/upload?path={{req_path}}" enctype="multipart/form-data" target="hidden_iframe" onsubmit="return addMessage();"><input type="file" name="file" class="file-input"><input type="submit" value="上傳文件" class="upload-btn" onclick="showUploadingMessage();"></form><div id="messages" class="messages"></div><div id="uploadingMessage" class="uploading-message" style="display:none;">正在上傳文件,請稍候...</div></div><div class="table-container"><div class="table-header"><h4>當前目錄: {{the_path}}</h4></div><div class="table-scroll"><table><thead><tr><th>文件名稱</th><th>文件類別</th><th>文件大小</th><th>訪問權限</th><th>所屬用戶</th><th>所屬組</th>                <th>最后修改時間</th></tr></thead><tbody>{% for item in data %}<tr class="{{ item.type }}"><td><a href="{{ item.href }}" class="{{ item.type }}">{{ item.name }}</a></td><td>{{ item.type }}</td><td>{{ item.size }}</td><td>{{ item.permissions }}</td><td>{{ item.owner }}</td><td>{{ item.group }}</td><td>{{ item.mtime }}</td></tr>{% endfor %}</tbody></table></div></div><div class="footer"><p>文件目錄管理系統 | 優雅簡潔的文件瀏覽體驗</p></div><iframe name="hidden_iframe" id="hidden_iframe" style="display:none;"></iframe><script type="text/javascript">function showUploadingMessage() {document.getElementById('uploadingMessage').style.display = 'block';}function addMessage() {var iframe = document.getElementById('hidden_iframe');iframe.onload = function() {var content = iframe.contentDocument || iframe.contentWindow.document;var message = content.body.innerHTML;var messagesDiv = document.getElementById('messages');messagesDiv.innerHTML = '<p>' + message + '</p>';messagesDiv.style.display = 'block';document.getElementById('uploadingMessage').style.display = 'none';// 3秒后隱藏消息setTimeout(function() {messagesDiv.style.display = 'none';location.href = location.href;}, 3000);};return true;}</script>
</body>
</html>

新模板的頁面效果如下:

?

🏷? 如有疑問,可以關注?我的知識庫,直接提問即可。?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909423.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909423.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909423.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【0.2 漫畫操作系統原理】

??? 漫畫操作系統原理 ?? 學習目標:深入理解操作系統核心原理,為Java并發編程和性能優化打下堅實基礎 ?? 第一章:操作系統初識篇 ?? 什么是操作系統? 想象一下,你是一個大型圖書館的館長… ?? 沒有操作系統 vs 有操作系統沒有操作系統: 讀者1 → 直接找書架…

第1章 C# 和 .NET 框架 筆記

第1章 C# 和 .NET 框架 1.1 在 .NET 之前 C#為在.NET框架上開發程序而設計的編程語言。 MFC&#xff08;Microsoft Foundation Class&#xff0c;微軟基礎類庫&#xff09; 微軟公司提供的一個類庫&#xff0c;以 C 類的形式封裝了 Windows 的 API&#xff0c;并包含一個應…

Django全棧開發實戰與架構思考

一、框架選型與開發范式 作為Python生態最成熟的Web框架&#xff0c;Django的"電池全包"理念在2.3版本后得到更徹底的貫徹。項目初期通過django-admin startproject生成的腳手架已包含&#xff1a; 自動化ORM遷移系統 內置Admin后臺管理界面 基于WSGI的中間件管道…

微服務--Gateway網關

1. Gateway簡介 Gateway網關是微服務架構中不可或缺的組件&#xff0c;是微服務架構中的統一入口&#xff0c;它作為所有客戶端請求的第一道防線&#xff0c;負責請求的路由、過濾和聚合。 Gateway核心功能 路由(Routing) 根據請求路徑、Header、參數等將請求路由到不同微服…

區塊鏈與人工智能的融合:從信任到智能的IT新引擎

在信息技術&#xff08;IT&#xff09;的飛速發展中&#xff0c;兩大顛覆性技術的交匯正掀起一場革命——區塊鏈與人工智能&#xff08;AI&#xff09;的融合。2025年&#xff0c;隨著數據隱私需求的激增、去中心化應用的爆發以及企業對可信智能系統的追求&#xff0c;區塊鏈與…

Javascript什么是原型和原型鏈,八股文

原型:函數都有prototype屬性,稱之為原型&#xff0c;也稱為原型對象 原型可以放一些屬性和方法&#xff0c;共享給實例對象使用 原型可以做繼承 原型鏈:對象都有__proto__屬性,這個屬性指向它的原型對象,原型對象也是對象,也有__proto__屬性,指向原型對象的原型對象,這樣一層一…

生日悖論理論及在哈希函數碰撞中的應用

目錄 一、生日悖論&#xff08;Birthday Paradox&#xff09;介紹 二、生日悖論的數學解釋 &#xff08;一&#xff09;計算所有人生日都不同的概率 數學推導 示例計算 &#xff08;二&#xff09;至少有兩個人生日相同的概率 三、哈希函數碰撞與生日悖論的關系思考 &a…

探索數據的力量:Elasticsearch中指定鏈表字段的統計查詢記錄

目錄 一、基本的數據結構說明 二、基本的統計記錄 &#xff08;一&#xff09;統計當前索引中sellingProducts的所有類型 &#xff08;二&#xff09;檢索指定文檔中sellingProducts的數據總量 &#xff08;三&#xff09;檢索指定文檔中sellingProducts指定類型的數量統計…

細節致勝:如何重塑反向海淘用戶體驗

在反向海淘的激烈競爭中&#xff0c;客戶體驗已成為決定勝負的關鍵。一次流暢的購物旅程、一個貼心的服務細節&#xff0c;都可能讓海外消費者成為品牌的忠實傳播者。易境通代購商城系統正是以極致體驗為核心&#xff0c;通過精細化服務管理&#xff0c;助力企業贏得用戶口碑與…

Docker 分階段構建

Docker 分階段構建 Docker 分階段構建&#xff08;Multi-stage Build&#xff09;是一種高效的鏡像構建技術&#xff0c;允許在一個 Dockerfile 中使用多個構建階段&#xff0c;每個階段可以使用不同的基礎鏡像&#xff0c;最終只保留需要的文件&#xff0c;從而顯著減小鏡像體…

人工智能學習23-BP-圖像編碼

人工智能學習概述—快手視頻 人工智能學習23-BP-圖像編碼—快手視頻

k8s的開篇學習和安裝

k8s的開篇學習 學習網站 參考資料 1。 K8S能干什么 [概述 | Kubernetes](https://kubernetes.io/zh-cn/docs/concepts/overview/#why-you-need-kubernetes-and-what-can-it-do)需要開代理 2。docker資料 https://docs.docker.com/get-started/3.prometheus資料 https://promet…

CS144 lab0: warmup

Lab 0: networking warmup 1. 環境 依賴配置 sudo apt update && sudo apt install git cmake gdb build-essential clang \clang-tidy clang-format gcc-doc pkg-config glibc-doc tcpdump tsharkg13配置 ppa中科大源 # deb https://ppa.launchpadcontent.net/ubu…

StarRocks

StarRocks 是一個高性能的 分布式 MPP(Massively Parallel Processing)數據庫,主要用于 實時數據分析(Real-Time Analytics),是新一代的 OLAP 數據庫,對標 ClickHouse、Apache Doris 等。 ?? 一、StarRocks 是什么? StarRocks 是一個面向實時分析場景、支持高并發、高…

8088單板機8259中斷的軟件觸發測試

1.工作原理 8086和8088的中斷設計的是很巧妙的&#xff0c;比如給8259的IR1配置了一個中斷&#xff0c;中斷號為21H&#xff0c;那么當真個引腳出現高電平的時候&#xff0c;就會觸發相應上的中斷響應。但&#xff0c;這不是唯一能夠觸發21H中斷的方法&#xff0c;還可以通過軟…

TC3xx中PFLASH緩存對XCP標定常量的影響

1、TC3xx中PFLASH緩存&#xff08;Cache&#xff09;對XCP標定的影響 XCP的映射用到TC3XX的Overlay功能需要使用一段Pflash內存。 Pflash數據有兩個段區。分別為0x80000000和0xA0000000為起始地址的PFLASH段。 如上&#xff0c;兩段數據的區別是一個段8有CACHE緩存&#xff0c;…

代碼審計服務:如何解決誤報與漏報難題,保障軟件安全?

代碼審計服務在保障軟件質量、安全合規等方面扮演著關鍵角色&#xff0c;特別是在數字化浪潮席卷而來的今天&#xff0c;其重要性日益顯著。它能揭露代碼中的不足&#xff0c;進而為軟件開發提供有力的效率和安全性保障。 誤報與漏報難題 常規的代碼審查工具&#xff0c;其錯…

web方向第一次考核內容

一.考核內容 Web組大一下考核之HTML、CSS 1.為什么要清除浮動&#xff08;4)&#xff0c;清除浮動的方法有哪些&#xff1f;(6)&#xff08;至少兩種&#xff09; 2.怎么實現左邊左邊寬度固定右邊寬度自適應的布局&#xff1f;(10) 3.講講flex:1;(10) 4.怎么實現移動端適配不同…

HarmonyOS 5 Cordova有哪些熱門插件?

以下是 HarmonyOS 5 環境下 Cordova 的熱門插件及核心代碼實現&#xff08;綜合實際開發場景高頻使用&#xff09;&#xff1a; 一、核心工具類插件 1. ?高性能圖片壓縮插件? ?功能?&#xff1a;直接調用鴻蒙 ImageSource API 實現硬件級加速壓縮 ?代碼實現?&#xff…

Cesium圓錐漸變色實現:融合頂點著色器、Canvas動態貼圖與靜態紋理的多方案整合

在Cesium中渲染圓錐體時&#xff0c;無論采用頂點著色器、Canvas動態貼圖還是靜態圖片貼圖&#xff0c;其漸變色均需滿足以下條件&#xff1a; 圓形結構&#xff1a;漸變范圍限定在圓錐底面的圓形區域內。徑向擴散&#xff1a;顏色從圓心向外逐步變化&#xff08;如紅→黃→藍…