golang web 文件服务器 WFS

本文介绍了如何利用Golang的标准库简洁地创建一个Web文件服务器WFS,该服务器允许用户通过浏览器查看本地托管目录的内容。通过实现自定义的ResponseBodyWriter并在Write方法中修改响应,只需一行命令即可启动并访问服务器。
摘要由CSDN通过智能技术生成

golang 使用标准库 30行代码实现 web 文件托管服务器

WFS(Web File Server) 是一个可以通过浏览器浏览本地托管目录的在线文件服务器。

使用自定义的 ResponseBodyWriter 结构在 Write 函数中重写 http.ResponseWriter 响应内容。

运行程序,访问 http://127.0.0.1:8080/ 即可访问 exe 根目录内容。

在这里插入图片描述

package main

import (
	"bytes"
	"log"
	"net/http"
	"os"
	"path/filepath"
)

func codeStarts() string {
	return `<!DOCTYPE html>
<html>
<head>
    <title>Title</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <!-- UIkit CSS -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/uikit@3.10.1/dist/css/uikit.min.css"/>

    <!-- UIkit JS -->
    <script src="https://cdn.jsdelivr.net/npm/uikit@3.10.1/dist/js/uikit.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/uikit@3.10.1/dist/js/uikit-icons.min.js"></script>
</head>
<body class="uk-container uk-width-2xlarge">
<div class="uk-card uk-card-default uk-card-body">
	<header class="uk-label">FileServer - 驭鲸环球</header>
    <ul class="uk-list uk-list-striped uk-list-collapse">`
}

func codeEnd() string {
	return `</ul>
</div>
</body>
</html>`
}

type ResponseBodyWriter struct {
	http.ResponseWriter
	body *bytes.Buffer
}

func (r ResponseBodyWriter) Write(b []byte) (int, error) {
	if bytes.Equal(b, []byte{60, 112, 114, 101, 62, 10} /*<pre>*/) {
		return r.ResponseWriter.Write([]byte(codeStarts()))
	} else if bytes.Equal(b, []byte{60, 47, 112, 114, 101, 62, 10} /*</pre>*/) {
		return r.ResponseWriter.Write([]byte(codeEnd()))
	} else if bytes.HasPrefix(b, []byte("<a")) || bytes.HasSuffix(b, []byte("</a>")) {
		s := append([]byte("<li>"), b...)
		s = append(s, []byte("</li>")...)
		//r.body.Write(s)
		return r.ResponseWriter.Write(s)
	}
	return r.ResponseWriter.Write(b)
}

func middleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) {
		w := &ResponseBodyWriter{ResponseWriter: writer, body: &bytes.Buffer{}}
		writer = w
		next.ServeHTTP(writer, request)
	})
}

func main() {
	path, _ := filepath.Abs(filepath.Dir(os.Args[0]))
	//设置wfs根目录
	//path = "D:/Games/Naraka"
	fileHandler := http.FileServer(http.Dir(path))
	http.Handle("/", middleware(fileHandler))
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Println(err)
	}
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值