modify new file

master
兔子 1 year ago
parent 1ea024e28f
commit d00cf408d3

@ -2,6 +2,221 @@ package httpserver
import "path/filepath"
func (h *HttpServer) FileType(name string) string {
ext := filepath.Ext(name)
if len(ext) == 0 || ext == "." {
return "文件"
}
ext = ext[1:]
mimeMap := map[string]string{
"3g2": "视频文件",
"3gp": "视频文件",
"7z": "压缩文件",
"aac": "音频文件",
"aif": "音频文件",
"aiff": "音频文件",
"amr": "音频文件",
"apk": "Android 应用程序",
"appx": "Windows 应用程序",
"asf": "视频文件",
"avi": "视频文件",
"bak": "备份文件",
"bat": "批处理文件",
"bin": "二进制文件",
"bmp": "图像文件",
"c": "源代码文件",
"cab": "Windows 安装文件",
"cfg": "配置文件",
"class": "Java 类文件",
"com": "可执行文件",
"conf": "配置文件",
"cpp": "C++ 源代码文件",
"crx": "Google Chrome 扩展",
"cs": "C# 源代码文件",
"csv": "电子表格文件",
"cue": "光盘映像文件",
"dat": "数据文件",
"deb": "Debian 安装包",
"dll": "动态链接库文件",
"dmg": "MacOS 安装文件",
"doc": "Microsoft Word 文档",
"docx": "Microsoft Word 文档",
"dtd": "文档类型定义文件",
"dwg": "CAD 文件",
"dxf": "CAD 文件",
"eml": "电子邮件文件",
"eps": "矢量图形文件",
"exe": "可执行文件",
"flac": "音频文件",
"flv": "视频文件",
"fnt": "字体文件",
"fon": "字体文件",
"gif": "图像文件",
"gz": "压缩文件",
"htm": "网页文件",
"html": "网页文件",
"ibooks": "iBooks 电子书",
"ics": "日历文件",
"iso": "光盘映像文件",
"jar": "Java 应用程序",
"java": "Java 源代码文件",
"jpe": "图像文件",
"jpeg": "图像文件",
"jpg": "图像文件",
"js": "JavaScript 文件",
"json": "JSON 文件",
"key": "Keynote 演示文稿",
"log": "日志文件",
"m4a": "音频文件",
"m4v": "视频文件",
"mdb": "Microsoft Access 数据库文件",
"mht": "网页存档文件",
"mid": "图像文件",
"midi": "音频文件",
"mkv": "视频文件",
"mov": "视频文件",
"mp3": "音频文件",
"mp4": "视频文件",
"mpeg": "视频文件",
"mpg": "视频文件",
"msg": "电子邮件文件",
"nes": "NES 游戏 ROM 文件",
"obj": "3D 模型文件",
"odp": "OpenOffice Impress 演示文稿",
"ods": "OpenOffice Calc 电子表格文件",
"odt": "OpenOffice Writer 文档",
"ogg": "音频文件",
"otf": "字体文件",
"pages": "Pages 文档",
"pct": "图像文件",
"pdb": "Palm 数据库文件",
"pdf": "Adobe PDF 文档",
"php": "PHP 文件",
"go": "Go 源代码文件",
"pkg": "MacOS 安装包",
"pl": "Perl 文件",
"png": "图像文件",
"ppt": "PowerPoint 演示文稿",
"pptx": "PowerPoint 演示文稿",
"ps": "PostScript 文件",
"psd": "Photoshop 文件",
"py": "Python 文件",
"rar": "压缩文件",
"reg": "Windows 注册表文件",
"rm": "视频文件",
"rmvb": "视频文件",
"rom": "游戏 ROM 文件",
"rpm": "Red Hat Package Manager 安装包",
"rtf": "Rich Text Format 文档",
"sav": "存档文件",
"sh": "Shell 脚本文件",
"srt": "字幕文件",
"sql": "SQL 数据库文件",
"svg": "矢量图形文件",
"swf": "Flash 文件",
"tar": "压缩文件",
"tbz": "压缩文件",
"tbz2": "压缩文件",
"tgz": "压缩文件",
"tex": "TeX 文档",
"tga": "图像文件",
"tif": "图像文件",
"tiff": "图像文件",
"torrent": "BitTorrent 文件",
"ttf": "字体文件",
"txt": "纯文本文件",
"uue": "UUEncode 编码文件",
"vbs": "VBScript 文件",
"vcf": "联系人文件",
"wav": "音频文件",
"webm": "视频文件",
"wma": "音频文件",
"wmv": "视频文件",
"woff": "字体文件",
"wpd": "WordPerfect 文档",
"wps": "Microsoft Works 文档",
"xhtml": "网页文件",
"xls": "Excel 电子表格文件",
"xlsx": "Excel 电子表格文件",
"xml": "XML 文件",
"xpi": "Mozilla Firefox 扩展",
"xps": "Windows XPS 文档",
"yaml": "YAML 配置文件",
"yml": "YAML 配置文件",
"zip": "压缩文件",
"cmd": "命令行脚本文件",
"gadget": "Windows 桌面小工具",
"hlp": "帮助文件",
"ini": "配置文件",
"ins": "Internet 设置文件",
"isp": "Internet 设置文件",
"job": "计划任务文件",
"jse": "加密的 JavaScript 文件",
"lnk": "Windows 快捷方式",
"msc": "Microsoft 控制台文件",
"msp": "Windows Installer 补丁文件",
"mst": "Windows Installer 转换文件",
"nls": "国家化字符串文件",
"ocx": "ActiveX 控件文件",
"ops": "Office Profile Settings 文件",
"pcd": "Photo CD 图片文件",
"pif": "MS-DOS 程序快捷方式",
"prf": "Outlook 配置文件",
"pst": "Outlook 数据文件",
"scf": "Windows Explorer 命令文件",
"scr": "屏幕保护程序文件",
"sct": "Windows Script Component 文件",
"shb": "Windows 快捷方式对象文件",
"shs": "Shell Scrap Object 文件",
"sys": "系统文件",
"theme": "Windows 主题文件",
"tmp": "临时文件",
"url": "Internet 快捷方式",
"vb": "VBScript 文件",
"vbe": "VBScript 文件",
"vxd": "虚拟设备驱动程序文件",
"wsc": "Windows 脚本组件文件",
"wsf": "Windows 脚本文件",
"wsh": "Windows Script Host 设置文件",
"hta": "HTML 应用程序文件",
"cpl": "控制面板文件",
"msi": "Windows Installer 安装程序",
"nfo": "信息文本文件",
"odc": "Office 数据连接文件",
"p7b": "数字证书文件",
"spc": "数字证书文件",
"pem": "X.509 证书文件",
"cer": "X.509 证书文件",
"der": "X.509 证书文件",
"pfx": "个人信息交换格式文件",
"p12": "个人信息交换格式文件",
"pot": "PowerPoint 模板文件",
"pps": "PowerPoint 幻灯片演示文件",
"ps1": "Windows PowerShell 脚本文件",
"pub": "Publisher 文件",
"qbb": "QuickBooks 备份文件",
"qbw": "QuickBooks 公司文件",
"qxd": "QuarkXPress 文件",
"qxp": "QuarkXPress 文件",
"ra": "音频文件",
"ram": "音频文件",
"rb": "Ruby 文件",
"rdf": "RDF 文件",
"res": "资源文件",
"sdf": "Microsoft SQL Server CE 数据库文件",
"sln": "Visual Studio 解决方案文件",
"stl": "3D 模型文件",
"sub": "字幕文件",
"ssa": "字幕文件",
"ass": "字幕文件",
}
mime, ok := mimeMap[ext]
if !ok {
return "其他文件"
}
return mime
}
func (h *HttpServer) MIME(fullpath string) string {
ext := filepath.Ext(filepath.Base(fullpath))
if len(ext) == 0 || ext == "." {

@ -10,6 +10,7 @@ import (
"fmt"
"io"
"io/ioutil"
"math"
"net"
"net/http"
"os"
@ -19,7 +20,7 @@ import (
"time"
)
var version = "2.0.0"
var version = "2.0.1"
type HttpServerCfgs func(cfg *HttpServerCfg)
@ -42,6 +43,135 @@ type HttpServer struct {
HttpServerCfg
}
var htmlTitle string = `<!DOCTYPE html>
<html lang="zh_CN">
<head>
<meta charset="UTF-8">
<title>B612 Http Server %s</title>
<style>
* {
box-sizing: border-box;
}
body {
background-color: #f5f5f5;
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
}
.container {
max-width: 960px;
margin: 0 auto;
padding: 24px;
}
h1 {
text-align: center;
margin-bottom: 24px;
}
table {
width: 100%%;
border-collapse: collapse;
margin-top: 24px;
}
th,
td {
padding: 12px;
text-align: left;
border-bottom: 1px solid #ddd;
}
th:hover {
cursor: pointer;
background-color: #ddd;
}
.filename {
color: #007bff;
text-decoration: underline;
}
.filetype {
text-transform: uppercase;
}
@media screen and (max-width: 600px) {
table {
font-size: 14px;
}
}
</style>
</head>
<body>
<div class="container">
<h1>B612 Http Server - %s</h1>
<hr /><pre><h2> %s </h2></pre>%s
<table>
<thead>
<tr>
<th onclick="sortTable(0)">Name</th>
<th onclick="sortTable(1)">Modified</th>
<th onclick="sortTable(2)">Size</th>
<th onclick="sortTable(3)">Type</th>
</tr>
</thead>
<tbody>`
var htmlTail = ` </tbody>
</table>
</div>
<script>
function sortTable(n) {
const table = document.querySelector('table');
const rows = table.rows;
let switching = true;
let shouldSwitch = false;
let direction = 'asc';
let switchcount = 0;
while (switching) {
switching = false;
let i;
for (i = 1; i < rows.length - 1; i++) {
shouldSwitch = false;
const x = rows[i].getElementsByTagName("td")[n];
const y = rows[i + 1].getElementsByTagName("td")[n];
if (direction === 'asc') {
if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
shouldSwitch = true;
break;
}
} else if (direction === 'desc') {
if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) {
shouldSwitch = true;
break;
}
}
}
if (shouldSwitch) {
rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
switching = true;
switchcount++;
} else {
if (switchcount === 0 && direction === 'asc') {
direction = 'desc';
switching = true;
}
}
}
}
</script>
</body>
</html>
`
func WithTLSCert(cert, key string) HttpServerCfgs {
return func(cfg *HttpServerCfg) {
cfg.key = key
@ -310,13 +440,18 @@ func (h *HttpServer) getFolder(log *starlog.StarLogger, w http.ResponseWriter, r
if r.Method != "GET" {
return nil
}
w.Write([]byte("<html>\n<style>\np{margin: 2px auto}\n</style>\n<h1>B612 Http Server - " + version + "</h1>"))
var upload string
if h.uploadFolder != "" {
w.Write([]byte("<a href=/b612?upload=true>Upload Web Page Is Openned!</a><br /><br />"))
upload = `<a href=/b612?upload=true>Upload Web Page Is Openned!</a>`
}
w.Write([]byte("<hr /><pre>\n"))
w.Write([]byte(fmt.Sprintf(htmlTitle, r.URL.Path, version, r.URL.Path, upload)))
if r.URL.Path != "/" {
w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %s</p>\n", r.URL.Path+"/..", "..", "上层文件夹")))
p := r.URL.Path
if p[len(p)-1:] != "/" {
p += "/"
}
w.Write([]byte(fmt.Sprintf(`<tr><td><a class="filename" href="%s">%s</a></td><td>%s</td><td>%s</td><td class="filetype">%s</td></tr>`,
p+"..", "..", "-", "-", "上层文件夹")))
}
if r.URL.Path == "/" {
r.URL.Path = ""
@ -327,13 +462,15 @@ func (h *HttpServer) getFolder(log *starlog.StarLogger, w http.ResponseWriter, r
for _, v := range dir {
if v.Name() != "." || v.Name() != ".." {
if !v.IsDir() {
w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %d %s</p>\n", r.URL.Path+"/"+v.Name(), v.Name(), int(v.Size()), v.ModTime().Format("2006-01-02 15:04:05"))))
w.Write([]byte(fmt.Sprintf(`<tr><td><a class="filename" href="%s">%s</a></td><td>%s</td><td>%s</td><td class="filetype">%s</td></tr>`,
r.URL.Path+"/"+v.Name(), v.Name(), v.ModTime().Format("2006-01-02 15:04:05"), fmt.Sprintf("%d (%s)", v.Size(), h.trimSize(v.Size())), h.FileType(v.Name()))))
} else {
w.Write([]byte(fmt.Sprintf("<p><a href='%s'>%s</a> %s %s</p>\n", r.URL.Path+"/"+v.Name(), v.Name(), "文件夹", v.ModTime().Format("2006-01-02 15:04:05"))))
w.Write([]byte(fmt.Sprintf(`<tr><td><a class="filename" href="%s">%s</a></td><td>%s</td><td>%s</td><td class="filetype">%s</td></tr>`,
r.URL.Path+"/"+v.Name(), v.Name(), v.ModTime().Format("2006-01-02 15:04:05"), "-", "文件夹")))
}
}
}
w.Write([]byte("</pre>\n</html>"))
w.Write([]byte(htmlTail))
return nil
}
@ -434,6 +571,21 @@ func (h *HttpServer) getFile(log *starlog.StarLogger, w http.ResponseWriter, r *
return nil
}
func (h *HttpServer) trimSize(size int64) string {
var tani string
tani = fmt.Sprintf("%v Byte", size)
if f64 := float64(size) / 1024; f64 > 1 {
tani = fmt.Sprintf("%.3f KB", math.Trunc(f64*1e3+0.5)*1e-3)
if f64 = float64(f64) / 1024; f64 > 1 {
tani = fmt.Sprintf("%.3f MB", math.Trunc(f64*1e3+0.5)*1e-3)
if f64 = float64(f64) / 1024; f64 > 1 {
tani = fmt.Sprintf("%.3f GB", math.Trunc(f64*1e3+0.5)*1e-3)
}
}
}
return tani
}
func (h *HttpServer) uploadFile(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
w.WriteHeader(200)

Loading…
Cancel
Save