Golang - 實現文件管理服務器

先看效果:

代碼如下:

package mainimport ("fmt""html/template""log""net/http""os""path/filepath""strings"
)// 配置根目錄(根據需求修改)
//var baseDir = filepath.Join(os.Getenv("/")) // 用戶主目錄
// var baseDir = "C:\\" // Windows系統使用C盤根目錄
var baseDir = "/"    // Linux/Mac使用系統根目錄// 文件信息結構體
type FileInfo struct {Name  stringPath  stringIsDir bool
}// 頁面數據
type PageData struct {Path      stringParentDir stringFiles     []FileInfo
}// 自定義模板函數
var templateFuncs = template.FuncMap{"splitPath": func(path string) []string {return strings.Split(path, string(filepath.Separator))},"joinPath": func(parts ...string) string {return filepath.Join(parts...)},"slicePath": func(path string, index int) string {parts := strings.Split(path, string(filepath.Separator))return filepath.Join(parts[:index]...)},
}func main() {// 設置路由http.HandleFunc("/", fileHandler)// 啟動服務器fmt.Printf("文件管理服務器已啟動,訪問 http://localhost:8000/\n")fmt.Printf("根目錄: %s\n", baseDir)fmt.Println("按 Ctrl+C 停止服務器")log.Fatal(http.ListenAndServe(":8000", nil))
}func fileHandler(w http.ResponseWriter, r *http.Request) {// 獲取路徑參數path := r.URL.Query().Get("path")fullPath := filepath.Join(baseDir, path)// 安全檢查:確保路徑在baseDir下if !strings.HasPrefix(filepath.Clean(fullPath), filepath.Clean(baseDir)) {http.Error(w, "禁止訪問", http.StatusForbidden)return}// 檢查路徑是否存在fileInfo, err := os.Stat(fullPath)if err != nil {if os.IsNotExist(err) {http.Error(w, "文件不存在", http.StatusNotFound)} else {http.Error(w, "無法訪問文件", http.StatusInternalServerError)}return}// 如果是文件,直接提供下載if !fileInfo.IsDir() {http.ServeFile(w, r, fullPath)return}// 如果是目錄,列出內容dirEntries, err := os.ReadDir(fullPath)if err != nil {http.Error(w, "無法讀取目錄", http.StatusInternalServerError)return}// 準備文件列表var files []FileInfo// 添加上級目錄鏈接(如果不是根目錄)if path != "" {parentDir := filepath.Dir(path)if parentDir == path {parentDir = ""}files = append(files, FileInfo{Name:  ".. (上級目錄)",Path:  parentDir,IsDir: true,})}// 添加目錄和文件for _, entry := range dirEntries {entryPath := filepath.Join(path, entry.Name())files = append(files, FileInfo{Name:  entry.Name(),Path:  entryPath,IsDir: entry.IsDir(),})}// 準備模板數據data := PageData{Path:      path,ParentDir: filepath.Dir(path),Files:     files,}// 創建帶有自定義函數的模板tmpl := template.New("filelist").Funcs(templateFuncs)// 解析模板tmpl, err = tmpl.Parse(htmlTemplate)if err != nil {http.Error(w, "模板錯誤: "+err.Error(), http.StatusInternalServerError)return}// 執行模板err = tmpl.Execute(w, data)if err != nil {http.Error(w, "模板渲染錯誤: "+err.Error(), http.StatusInternalServerError)}
}// HTML模板(移除了非ASCII字符)
const htmlTemplate = `
<!DOCTYPE html>
<html>
<head><title>文件管理器 - {{.Path}}</title><style>body { font-family: Arial, sans-serif; margin: 20px; }h1 { color: #333; }ul { list-style-type: none; padding: 0; }li { padding: 5px 0; }a { text-decoration: none; color: #0066cc; }a:hover { text-decoration: underline; }.file { color: #666; }.dir { color: #009933; font-weight: bold; }.breadcrumb { margin-bottom: 20px; }</style>
</head>
<body><h1>文件管理器</h1><div class="breadcrumb"><a href="/?path=">根目錄</a>{{if .Path}}{{range $i, $part := splitPath .Path}}/ <a href="/?path={{joinPath (slicePath $.Path $i) $part}}">{{$part}}</a>{{end}}{{end}}</div><ul>{{range .Files}}<li><a href="/?path={{.Path}}" class="{{if .IsDir}}dir{{else}}file{{end}}">{{if .IsDir}}[DIR]{{else}}[FILE]{{end}} {{.Name}}</a></li>{{end}}</ul>
</body>
</html>
`

啟動服務:

[root@localhost test]# go run file.go
文件管理服務器已啟動,訪問 http://localhost:8000/
根目錄: /
按 Ctrl+C 停止服務器

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

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

相關文章

Linux-04-用戶管理命令

一、useradd添加新用戶: 基本語法: useradd 用戶名:添加新用戶 useradd -g 組名 用戶:添加新用戶到某個組二、passwd設置用戶密碼: 基本語法: passwd 用戶名:設置用戶名密碼 三、id查看用戶是否存在: 基本語法: id 用戶名 四、su切換用戶: 基本語法: su 用戶名稱:切換用…

Ollama 安裝 QWen3 及配置外網訪問指南

一、Ollama 安裝 QWen3 安裝步驟 首先嘗試運行 QWen3 模型&#xff1a; ollama run qwen3 如果遇到版本不兼容錯誤&#xff08;Error 412&#xff09;&#xff0c;表示需要升級 Ollama&#xff1a; curl -fsSL https://ollama.com/install.sh | sh 驗證版本&#xff1a; o…

高性能架構設計-數據庫(讀寫分離)

一、高性能數據庫簡介 1.高性能數據庫方式 讀寫分離&#xff1a;將訪問壓力分散到集群中的多個節點&#xff0c;沒有分散存儲壓力 分庫分表&#xff1a;既可以分散訪問壓力&#xff0c;又可以分散存儲壓力 2.為啥不用表分區 如果SQL不走分區鍵&#xff0c;很容易出現全表鎖…

【Hive入門】Hive性能優化:執行計劃分析EXPLAIN命令的使用

目錄 1 EXPLAIN命令簡介 1.1 什么是EXPLAIN命令&#xff1f; 1.2 EXPLAIN命令的語法 2 解讀執行計劃中的MapReduce階段 2.1 執行計劃的結構 2.2 Hive查詢執行流程 2.3 MapReduce階段的詳細解讀 3 識別性能瓶頸 3.1 數據傾斜 3.2 Shuffle開銷 3.3 性能瓶頸識別與優化 4 總結 在大…

開源模型應用落地-qwen模型小試-Qwen3-8B-快速體驗(一)

一、前言 阿里云最新推出的 Qwen3-8B 大語言模型,作為國內首個集成“快思考”與“慢思考”能力的混合推理模型,憑借其 80 億參數規模及 128K 超長上下文支持,正在重塑 AI 應用邊界。該模型既可通過輕量化“快思考”實現低算力秒級響應,也能在復雜任務中激活深度推理模式,以…

Kafka Producer的acks參數對消息可靠性有何影響?

1. acks0 可靠性最低生產者發送消息后不等待任何Broker確認可能丟失消息&#xff08;Broker處理失敗/網絡丟失時無法感知&#xff09;吞吐量最高&#xff0c;適用于允許數據丟失的場景&#xff08;如日志收集&#xff09; 2. acks1 (默認值) Leader副本確認模式生產者等待Le…

虛擬機centos7安裝docker

虛擬機CentOS 7上安裝 Docker流程 1. 更新系統軟件包 需要確保系統軟件包是最新的 sudo yum -y update sudo&#xff1a;以超級用戶權限執行命令。 yum&#xff1a;CentOS的包管理器工具。 -y&#xff1a;自動確認所有提示&#xff0c;直接執行。 2. 安裝 Docker 依賴 在安裝 …

ZYNQ MPSOC之PL與PS數據交互DMA方式

ZYNQ MPSOC之PL與PS數據交互DMA方式 1 摘要 XILINX ZYNQ 以及 ZYNQ MPSOC主要優勢在于異構 ARM+FPGA。其中非常關鍵的一點使用了 AXI 總線進行高速互聯。而且這個 AXI 總線是開放給我們用戶使用的。在前面的文章中我們詳解了使用了AXI-HP方式PL到PS端進行數據交互。本文主要涉…

枚舉法——C++算法【淚光2929】

前言 "打牢基礎,萬事不愁" .C的基礎語法的學習."學以致用,邊學邊用",編程是實踐性很強的技術,在運用中理解,總結. 引入 枚舉在成熟框架中,用得還挺多的.枚舉可以讓程序更容易理解 之前寫過一篇關于枚舉的帖子--- 白話編程---數據篇(4)枚…

HarmonyOS NEXT應用開發-Notification Kit(用戶通知服務)notificationManager.cancelAll

1.notificationManager.cancelAll 支持設備Phone2in1TabletCarWearable cancelAll(callback: AsyncCallback<void>): void 取消當前應用所有已發布的通知。使用callback異步回調。 系統能力&#xff1a;SystemCapability.Notification.Notification 示例&#xff1a; …

Mac 創建QT按鈕以及一些操作

在創建QT項目好 后我們打開mainwindow.cpp&#xff0c;下面所示的代碼都是在這個cpp文件里面因為它是窗口的入口函數 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QPushButton>//按鈕的頭文件MainWindow::MainWindow(QWidget *pa…

開源協議全解析:類型、選擇與法律風險規避指南

[TOC] 在當今開源軟件主導的技術生態中&#xff0c;開源協議&#xff08;Open Source License&#xff09;是決定項目能否被商業使用、二次開發的關鍵法律文件。據統計&#xff0c;GitHub上超過70%的項目使用某種形式的開源協議&#xff0c;但其中近30%存在協議兼容性問題。本…

TM1668芯片學習心得一

一、TM1668 是一種帶鍵盤掃描接口的LED&#xff08;發光二極管顯示器&#xff09;驅動控制專用電路&#xff0c;內部集成有MCU 數字接口、數據鎖存器、LED 高壓驅動、鍵盤掃描等電路。本產品性能優良&#xff0c;質量可靠。主要應用于VCR。 學習鏈接 二、 三、顯示寄存器的地址…

時空特征如何融合?LSTM+Resnet有奇效,SOTA方案預測準確率超91%

LSTM有著不錯的時序信息提取能力&#xff0c;ResNet有著不錯的空間特征信息提取能力。如果現在有時空特征融合的創新需求&#xff0c;我們是否能將LSTM和ResNet兩者的優點融合起來呢&#xff1f; 隨著這個思路下去&#xff0c;LSTM ResNet混合模型橫空出世&#xff0c;在各個…

[PRO_A7] SZ501 FPGA開發板簡介

SZ501 FPGA開發板簡介 概述 SZ501 FPGA開發板是專為高性能FPGA設計、快速原型開發和復雜應用調試打造的先進開發平臺。搭載Xilinx Artix-7系列XC7A100T FPGA芯片&#xff0c;SZ501提供卓越的邏輯運算能力和靈活的接口支持&#xff0c;廣泛適用于通信、信號處理、嵌入式系統及…

企業微信jdk 授權 記錄

1、npm install wecom/jssdk 2、index.html 引入 <script src"https://wwcdn.weixin.qq.com/node/open/js/wecom-jssdk-2.0.2.js"></script> 3、創建js import * as ww from "wecom/jssdk"; /*** 獲取企業微信jdk局方法----------------…

Android13增加第三方類實現加入到系統

1、將需要的添加包放在/frameworks/base/core/java/com目錄下&#xff0c;比如devmgr/devicemgr/DeviceMgr.java package com.devmgr.devicemgr; import android.content.Context; public class DeviceMgr {private volatile static DeviceMgr instance null;private Context…

計算機網絡核心知識點全解析(面試通關版)

一、網絡體系結構&#xff1a;從OSI到TCP/IP的分層設計 1.1 七層模型與四層模型對比 OSI七層模型核心功能TCP/IP四層對應典型協議生活類比應用層為應用程序提供服務&#xff08;如文件傳輸、郵件、Web瀏覽&#xff09;應用層HTTP、FTP、SMTP、DNS快遞面單信息&#xff08;收件…

AI圖稿生成訂單管理系統

讓設計生產“零誤差、全自動、秒響應” 一、核心價值&#xff1a;重構設計到生產的效率革命 效率提升70% 告別人工排版&#xff0c;AI自動復用歷史稿件模板&#xff0c;單次設計永久沉淀為可調用資產&#xff1b; 印刷文件生成速度達20萬張/分鐘&#xff0c;滿足電商大促、…

TwinCAT數據類型,%MX,%MD這些特殊符號

在 TwinCAT&#xff08;Beckhoff PLC 編程環境&#xff09;中&#xff0c;%MX、%MD 等符號是 IEC 61131-3 標準的地址表示法&#xff0c;用于直接訪問 PLC 的物理 I/O 或內存區域。這些符號通常用于 變量聲明 或 直接尋址&#xff0c;特別是在 TwinCAT 2 和 傳統 PLC 編程 中較…