modify new file
This commit is contained in:
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…
x
Reference in New Issue
Block a user