IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 手把手教你写复制U盘文件神器(三) -> 正文阅读

[网络协议]手把手教你写复制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博客

下一章:正在完善中

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-11-29 16:38:29  更:2021-11-29 16:39:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:59:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码