主要演示文件拖拽上传或点击上传到不同的目录中,提供下载和删除功能。

目录结构:

-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 +"&nbsp;&nbsp;&nbsp;刚才上传";
//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>&nbsp;&nbsp;-&nbsp;&nbsp;本目录文件</div>
<ul id="ul1" > {{range $i, $v := .Files}}
<li style="line-height:200%">
<span>&nbsp;{{$v.Name}}&nbsp;&nbsp;&nbsp;</span>
<span>&nbsp;{{$v.Date}}&nbsp;&nbsp;&nbsp;</span>
{{if $.FlagAllowDel}}
<span>&nbsp;<a href='#' onclick="del({{$v.Url}})" >删除</a>&nbsp;&nbsp;&nbsp;</span>
{{else}}
<span>&nbsp;<a href={{$v.Url}} download={{$v.Name}}>下载</a>&nbsp;&nbsp;&nbsp;</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)的更多相关文章

  1. 自己写一个网页版的Markdown实时编辑器

    这几天忙着使用Python+Django+sqlite 搭建自己的博客系统,但是单纯的使用H5的TextArea,简直太挫了有木有.所以,就想模仿一下人家内嵌到网页上的Markdown编辑器,从而让自 ...

  2. 用原生JS写一个网页版的2048小游戏(兼容移动端)

    这个游戏JS部分全都是用原生JS代码写的,加有少量的CSS3动画,并简单的兼容了一下移动端. 先看一下在线的demo:https://yuan-yiming.github.io/2048-online ...

  3. [Backbone.js]如何用backbone写一个仿网页版微信的webapp?

    var Chat = Backbone.Model.extend({ idAttribute:'id', initialize:function(options){ var users = this. ...

  4. nodejs写的一个网页爬虫例子(坏链率)

    因为工作需要,用nodejs写了个简单的爬虫例子,之前也没用过nodejs,连搭环境加写大概用了5天左右,so...要多简陋有多简陋,放这里给以后的自己看~~ 整体需求是:给一个有效的URL地址,返回 ...

  5. CAD使用SetxDataLong写数据(网页版)

    主要用到函数说明: MxDrawEntity::SetxDataLong 写一个long扩展数据,详细说明如下: 参数 说明 [in] BSTR val 字符串值 szAppName 扩展数据名称 n ...

  6. CAD使用SetxDataDouble写数据(网页版)

    主要用到函数说明: MxDrawEntity::SetxDataDouble 写一个Double扩展数据,详细说明如下: 参数 说明 [in] BSTR val 字符串值 szAppName 扩展数据 ...

  7. CAD使用SetxDataString写数据(网页版)

    主要用到函数说明: MxDrawEntity::SetxDataString 写一个字符串扩展数据,详细说明如下: 参数 说明 [in] BSTR val 字符串值 szAppName 扩展数据名称 ...

  8. 教你用纯Java实现一个网页版的Xshell(附源码)

    前言 最近由于项目需求,项目中需要实现一个WebSSH连接终端的功能,由于自己第一次做这类型功能,所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用,当时看到了很多这方面的项目,例如:Gat ...

  9. CAD使用SetXData写数据(网页版)

    主要用到函数说明: MxDrawEntity::SetXData 设置实体的扩展数据,详细说明如下: 参数 说明 [in] IMxDrawResbuf* pXData 扩展数据链表 js代码实现如下: ...

随机推荐

  1. 解决连接HIS连接不上数据库的问题

    运行程序单步运行,设置断点 配置HIS中的 GetDataBaseInfo类,将与本机无关的配置函数全部删除,(按照DMHospital.ini文件来对照修改),如下图: 往数据库中所创建的表中添加数 ...

  2. [SDOI2011]消耗战 题解

    题面 虚树的模板题: 虚树的思想是只保留有用的点(在这道题目里面显然是标记点和lca),然后重新构建一棵树,从而使节点大大减少,优化复杂度 我们维护一条链(以1号点为根),这条链左边的所有在虚树上的位 ...

  3. Python基础『二』

    目录 语句,表达式 赋值语句 打印语句 分支语句 循环语句 函数 函数的作用 函数的三要素 函数定义 DEF语句 RETURN语句 函数调用 作用域 闭包 递归函数 匿名函数 迭代 语句,表达式 赋值 ...

  4. 【openpyxl】 关于 单元格背景色 的疑惑

    openpyxl   优点: 对文件进行操作, 也就是说: 如果一台电脑 没有Office excel 或 WPS excel, xlsx 是打不开的,会提示你选择程序打开.   但这时    ope ...

  5. python函数篇0-1

    创建类和对象 面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用. 类就是一个模板,模板里可以包含多个函数, ...

  6. 搭建自己的框架WedeNet(二)

    WedeNet2018.Infrastructure-基础设施层:结构如下: Tools结构如下: 考虑到系统可能会有多个数据上下文(暂时以两个为例),所以根据需要定义两个T4模板用来生成对应的ent ...

  7. 一、maven学习

    1.下载(maven 自带Tomcat   命令tomcat:run) 2.配置环境变量(cmd测试   mvn -v) 3.配置config 4.命令 mvn clean (删除target目录) ...

  8. 关键词提取算法TF-IDF与TextRank

    一.前言 随着互联网的发展,数据的海量增长使得文本信息的分析与处理需求日益突显,而文本处理工作中关键词提取是基础工作之一. TF-IDF与TextRank是经典的关键词提取算法,需要掌握. 二.TF- ...

  9. Windows下Mysql 用户忘记密码时修改密码

    一般这种情况都可以用安全模式下修改来解决.安全模式下即跳过权限检查,输入账号后直接登录进mysql 1.使用管理员权限打开dos窗口,进入mysql安装目录的bin文件夹下,将Mysql服务关闭 sc ...

  10. deep_learning_凹凸函数

    什么是凸函数及如何判断一个函数是否是凸函数 t元j 一.什么是凸函数 对于一元函数f(xf(x),如果对于任意tϵ[0,1]tϵ[0,1]均满足:f(tx1+(1−t)x2)≤tf(x1)+(1−t) ...