用go iris 写的一个网页版文件共享应用(webapp)
主要演示文件拖拽上传或点击上传到不同的目录中,提供下载和删除功能。
目录结构:
-main.go
--share(用于分类存放上传文件的目录)
--v(视图目录)
---share.html
main.go
//自编了一个文件共享系统,everyone可上传下载,无权限控制,公网使用风险大,需完善
//所有文件将上传到./share/XXX目录下,可通过http://localhost:8080/share/XXX 访问并下载
//
package main import (
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"sort" "github.com/kataras/iris"
) const (
upload_path string = "./share/"
) //表示一个上传的文件
type Upfile struct {
Url string //位置,如share/XXX/
Name string //文件名,如abc.doc
Date string //文件时间,ModTime转string
} //表示权限
type Allow struct {
UP bool //可上传
Down bool //可下载
Del bool //可删除
} type Updir []Upfile //表示一个目录当中,所有上传的文件
// 用Len Less Swap使Updir可排序,可用sort.Sort排序
func (d Updir) Len() int { return len(d) } // Date降序
func (d Updir) Less(i, j int) bool {
return d[i].Date > d[j].Date
} // 交换
func (d Updir) Swap(i, j int) { d[i], d[j] = d[j], d[i] } func main() {
fmt.Println("OK!请访问 :8080/share")
//启动一个http 服务器
app := iris.New()
//静态文件服务
app.StaticWeb("/share", "./share")
//注册视图目录
tmpl := iris.HTML("./v", ".html")
app.RegisterView(tmpl)
//主页
app.Get("/share", func(ctx iris.Context) {
ctx.View("main.html")
})
//下载
app.Get("/share/{path:alphabetical}", func(ctx iris.Context) {
FlagAllowDel := false //允许删除文件标志
//URL中的路径
reqPath := ctx.Path() //如:/share/aaa
myfolder := "." + reqPath + "/" //如:./share/aaa/
//获取执行文件路径:
rootdir, err := filepath.Abs(filepath.Dir(os.Args[])) //如:e:\goapp\myapp
createf := rootdir + reqPath + "/" //如:e:\goapp\myapp/share/aaa/
_, err = os.Stat(createf) //os.Stat获取文件信息
//判断文件夹path存在,否则创建之 ,绝对路径
if os.IsNotExist(err) {
os.MkdirAll(createf, os.ModePerm)
}
//列出目录下的文件
var upfile Upfile
fileins := make(Updir, )
files, _ := ioutil.ReadDir(myfolder)
for _, file := range files {
if file.IsDir() {
continue
} else {
upfile.Name = file.Name()
upfile.Url = ctx.Path() + "/" + file.Name()
upfile.Date = file.ModTime().Format("2006-01-02 15:04:05")
fileins = append(fileins, upfile)
}
}
//fmt.Println(fileins[0].Name)
//倒序排序
sort.Sort(fileins)
ctx.ViewData("FlagAllowDel", FlagAllowDel)
ctx.ViewData("Files", fileins)
// 渲染视图文件: ./v/index.html
ctx.View("share.html") })
//主页管理,与主页共用模板 .v/share.html
app.Get("/admin/{path:alphabetical}", func(ctx iris.Context) {
FlagAllowDel := true //允许删除文件标志
//列出目录下的文件
var upfile Upfile
fileins := make(Updir, )
myfolder := "./share" + ctx.Path()[:] + "/"
files, _ := ioutil.ReadDir(myfolder)
for _, file := range files {
if file.IsDir() {
continue
} else {
upfile.Name = file.Name()
upfile.Url = ctx.Path() + "/" + file.Name()
upfile.Date = file.ModTime().Format("2006-01-02 15:04:05")
fileins = append(fileins, upfile)
}
}
//fmt.Println(fileins[0].Name)
//倒序排序
sort.Sort(fileins)
ctx.ViewData("FlagAllowDel", FlagAllowDel)
ctx.ViewData("Files", fileins)
// 渲染视图文件: ./v/index.html
ctx.View("share.html") })
//上传, 接收用XMLHttpRequest上传的文件
app.Post("/share/{path:alphabetical}", func(ctx iris.Context) {
//获取文件内容
file, head, err := ctx.FormFile("upfile")
//可参考Get时的路径判断pathwww是否存在,这里省略了...
myfolder := "." + ctx.Path() + "/"
defer file.Close()
//创建文件
fW, err := os.Create(myfolder + head.Filename) if err != nil {
fmt.Println("文件创建失败")
return
}
defer fW.Close()
_, err = io.Copy(fW, file)
if err != nil {
fmt.Println("文件保存失败")
return
}
ctx.JSON(iris.Map{"success": true, "res": head.Filename}) })
//下载,未使用
app.Get("/share/down", func(ctx iris.Context) {
//无效ctx.Header("Content-Disposition", "attachment;filename=FileName.txt")
ctx.ServeFile("./share/1.txt", false)
})
//删除
app.Post("/admin/{dir}", func(ctx iris.Context) {
path := ctx.PostValue("path") //如 /admin/aaa/111.txt
myfolder := "./share" + path[:]
fmt.Println(myfolder)
os.Remove(myfolder)
ctx.JSON(iris.Map{"success": true, "res": "aaaaaaaaaaaa"}) }) app.Run(iris.Addr(":8080"))
}
share.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{{.Title}}</title>
<style>
.file_upload_box {
display: inline-block;
width: 200px;
height: 50px;
position: relative;
overflow: hidden;
}
.file_upload_box input[type=file] {
position: absolute;
left: ;
top: ;
width: %;
line-height: 50px;
opacity: ;
cursor: pointer;
}
.file_upload_box a {
display: inline-block;
width: %;
line-height: 50px;
text-align: center;
font-family: "Microsoft yahei";
background-color: #f60;
color: #FFF;
font-weight: ;
text-decoration: none;
}
.flexcontainer{
display:flex;
}
</style> </head>
<body>
<div class="flexcontainer">
{{if $.FlagAllowDel}}
<span>管理面板</span>
{{else}}
<div id="fileSpan" style="background-color:#FFE;width:100%;height:50px">请将文件拖到这里上传(覆盖同名文件)</div>
<div class="file_upload_box">
<input type="file" name="file" onchange="upload(this)"/>
<a href="#none">上传文件</a>
</div>
{{end}} </div>
<script type="text/javascript">
window.onload = function(){
var uuz = document.getElementById('fileSpan'); uuz.ondragenter = function(e){
e.preventDefault();
} uuz.ondragover = function(e){
e.preventDefault();
this.innerHTML = '请松开鼠标';
this.style.cssText="background-color:#EFF;width:100%;height:50px;"
} uuz.ondragleave = function(e){
e.preventDefault();
this.innerHTML = '请将文件拖到这里上传';
this.style.cssText="background-color:#FFE;width:100%;height:50px;"
} uuz.ondrop = function(e){
e.preventDefault();
this.innerHTML = '请将文件拖到这里上传'; var upfile = e.dataTransfer.files[]; //获取要上传的文件对象(可以上传多个)
// alert(upfile.name)
//alert(upfile.type)
var formdata = new FormData();
var xhr = new XMLHttpRequest();
formdata.append('upfile', upfile); //设置服务器端接收的name为upfile
xhr.open("post","");
xhr.onreadystatechange = function(){
if(this.readyState==){
if(this.status==){ //上传成功
var resultText = this.responseText;
console.info(resultText);
//转json
var jsonObj = JSON.parse(resultText);
console.info(jsonObj);
if(jsonObj.success){
//var oUl = document.getElementById('ul1');
//var oLi = document.createElement('li');
//var oSpan = document.createElement('span');
//oSpan.innerHTML = jsonObj.res +" 刚才上传";
//oLi.appendChild(oSpan);
//oUl.insertBefore(oLi, oUl.children[0]);
//刷新
window.location.reload(); }
}else{
alert('上传失败,请使用另一种方式上传');
}
}
} xhr.send(formdata);
}
}
function upload(e){
var upfile = e.files[];
var formdata = new FormData();
var xhr = new XMLHttpRequest();
formdata.append('upfile', upfile); //设置服务器端接收的name为upfile
xhr.open("post","");
xhr.onreadystatechange = function(){
if(this.readyState==){
if(this.status==){ //上传成功
var resultText = this.responseText;
//转json
var jsonObj = JSON.parse(resultText);
console.info(jsonObj);
if(jsonObj.success){
//刷新
window.location.reload(); }
}
}
}
xhr.send(formdata);
}
</script>
<div><a href="/share">返回总目录</a> - 本目录文件</div>
<ul id="ul1" > {{range $i, $v := .Files}}
<li style="line-height:200%">
<span> {{$v.Name}} </span>
<span> {{$v.Date}} </span>
{{if $.FlagAllowDel}}
<span> <a href='#' onclick="del({{$v.Url}})" >删除</a> </span>
{{else}}
<span> <a href={{$v.Url}} download={{$v.Name}}>下载</a> </span>
{{end}}
</li>
{{end}}
</ul>
<script type="text/javascript">
function del(path){
//alert(path);
var formdata = new FormData();
var xhr = new XMLHttpRequest();
formdata.append('path', path); //设置服务器端接收
xhr.open("post","");
xhr.onreadystatechange = function(){
if(this.readyState==){
if(this.status==){ //成功
window.location.reload();
}
}else{
//alert('删除失败');
}
}
xhr.send(formdata);
}
</script>
</body>
</html>
参考:https://blog.csdn.net/fyxichen/article/details/60570484
用go iris 写的一个网页版文件共享应用(webapp)的更多相关文章
- 自己写一个网页版的Markdown实时编辑器
这几天忙着使用Python+Django+sqlite 搭建自己的博客系统,但是单纯的使用H5的TextArea,简直太挫了有木有.所以,就想模仿一下人家内嵌到网页上的Markdown编辑器,从而让自 ...
- 用原生JS写一个网页版的2048小游戏(兼容移动端)
这个游戏JS部分全都是用原生JS代码写的,加有少量的CSS3动画,并简单的兼容了一下移动端. 先看一下在线的demo:https://yuan-yiming.github.io/2048-online ...
- [Backbone.js]如何用backbone写一个仿网页版微信的webapp?
var Chat = Backbone.Model.extend({ idAttribute:'id', initialize:function(options){ var users = this. ...
- nodejs写的一个网页爬虫例子(坏链率)
因为工作需要,用nodejs写了个简单的爬虫例子,之前也没用过nodejs,连搭环境加写大概用了5天左右,so...要多简陋有多简陋,放这里给以后的自己看~~ 整体需求是:给一个有效的URL地址,返回 ...
- CAD使用SetxDataLong写数据(网页版)
主要用到函数说明: MxDrawEntity::SetxDataLong 写一个long扩展数据,详细说明如下: 参数 说明 [in] BSTR val 字符串值 szAppName 扩展数据名称 n ...
- CAD使用SetxDataDouble写数据(网页版)
主要用到函数说明: MxDrawEntity::SetxDataDouble 写一个Double扩展数据,详细说明如下: 参数 说明 [in] BSTR val 字符串值 szAppName 扩展数据 ...
- CAD使用SetxDataString写数据(网页版)
主要用到函数说明: MxDrawEntity::SetxDataString 写一个字符串扩展数据,详细说明如下: 参数 说明 [in] BSTR val 字符串值 szAppName 扩展数据名称 ...
- 教你用纯Java实现一个网页版的Xshell(附源码)
前言 最近由于项目需求,项目中需要实现一个WebSSH连接终端的功能,由于自己第一次做这类型功能,所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用,当时看到了很多这方面的项目,例如:Gat ...
- CAD使用SetXData写数据(网页版)
主要用到函数说明: MxDrawEntity::SetXData 设置实体的扩展数据,详细说明如下: 参数 说明 [in] IMxDrawResbuf* pXData 扩展数据链表 js代码实现如下: ...
随机推荐
- 剑指offer9:青蛙变态跳台阶,1,2,3……,n。
1. 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 2. 思路和方法 每个台阶都有跳与不跳两种情况(除了最后一个台阶),最后 ...
- C语言 --- 初级指针
1.内存的访问:直接访问,间接访问. 直接访问:int a = 0;直接对a赋值.选一个内存地址,让他存20这个数. a += 10; ...
- 安装laravel框架
方式一:Windows版本通过composer来下载安装laravel框架 一:laravel是php的一个web框架.laravel框架安装主要依赖composer工具,本经验就介绍一下怎么在win ...
- Java回调实现异步 (转)
出处: Java回调实现异步 在正常的业务中使用同步线程,如果服务器每处理一个请求,就创建一个线程的话,会对服务器的资源造成浪费.因为这些线程可能会浪费时间在等待网络传输,等待数据库连接等其他事情上, ...
- go install
go get使用时的附加参数 使用 go get 时可以配合附加参数显示更多的信息及实现特殊的下载和安装操作,详见下表所示. go get 使用时的附加参数 附加参数 备 注 -v 显示操作流程的日志 ...
- IIS Express启动不了的的解决方案
netsh http show iplisten netsh http delete iplisten ipaddress=11.22.33.44 (where 11.22.33.44 is the ...
- 经典算法,yuv与rgb互转,查表法,让你的软件飞起来
代码的运算速度取决于以下几个方面 1. 算法本身的复杂度,比如MPEG比JPEG复杂,JPEG比BMP图片的编码复杂. 2. CPU自身的速度和设计架构 3. CPU的总线带宽 4. 您自己代码的写法 ...
- 1-10000以内的完数(js)
//1-10000以内的完数 //完数:因子之和相加等于这个数 //例如:6的因子为1,2,3:1+2+3=6 // 6 // 28 // 496 // 8128 let sum = 0, i, j; ...
- 反序列化报错回显、反弹shell
• 使用java.net.URLClassLoader类,远程加载自定义类(放在自己服务器上的jar包),可以自定义方法执行. • 在自定义类中,抛出异常,使其成功随着Jboss报错返回命令执行结果. ...
- 测试使用Timer定时调用http接口
转自:https://blog.csdn.net/qq_36004521/article/details/80101881