笔记:nodejs 原生js实现文件上传下载

文件上传、下载 client

<templete>

<input type="file" id="file" style="width:50%;height:50px;" placeholder="请选择上传文件" @change="uploadFile" />

<button style="width:40%;height:50px;" @click="loadFile" > 下载文件</button>

</templete>

<script>

methods:{

uploadFile(){  //上传文件

            var file = document.querySelector("#file").files[0]; //获取上传文件

            var formdata = new FormData();

            formdata.append("file",file);

            var xhr = new XMLHttpRequest();

            xhr.open("post","http://xxx/fileInfo/");

            xhr.onreadystatechange = function () {

                if (xhr.readyState === 4 && xhr.status==200){

                         console.log('上传结束')

                }

            }

            xhr.upload.onprogress = function (event) {

                if(event.lengthComputable){

                    console.log('------>'+event.loaded/event.total *100+'%')  //显示上传进度

                }

            }

            xhr.send(formdata);

        },

loadFile(){ //下载文件

            var xhr = new XMLHttpRequest();

            xhr.open("post","http://xxx/fileInfo/fileInfo/load");

            xhr.send({});

            xhr.onreadystatechange = function () { //获取下载结果

                console.log('onreadystatechange --------')

                if (xhr.readyState === 4 && xhr.status==200){

                    let response = xhr.response

                    response = JSON.parse(response)

                    console.log(response.file)

                    let file = response.file //文件数据

                    let filename = response.name //文件名称

                    let filetype = response.type //文件类型

                    console.log(`文件名:${filename} --- 文件类型:${filetype}  --- 下载中...`)

                    let loadBuffer = Buffer.from(file)

                    let blob = new Blob([loadBuffer], {type: filetype}) //表示一个不可变、原始数据的类文件对象,想仔细了解可以自行搜索

                    //生成临时元素自动下载

                    let a = document.createElement('a')

                    a.download = filename

                    a.href = URL.createObjectURL(blob)

                    document.body.appendChild(a)

                    a.click()

                    document.body.removeChild(a)

                }

            }

        },

}

</script>

文件上传下载  API

koa 使用插件koa-body进行转换,影响文件流获取

文件流根据各自的方式获取

import koaBody from 'koa-body'

app.use(koaBody({multipart:true}))

//上传接口

router.post('/', async (ctx) => {

  try{

  let files = ctx.request.body.files  //获取文件流

  let file = files.file //获取上传文件

  let filetype = file.type //获取上传文件类型

  let filename= file.name //获取上传文件名称

  let fileReader = fs.createReadStream(file.path) //fs读取文件流

  //读取数据内置的事件监听

  let str = ''

  fileReader.on('data',(chunk) => { //fs获取读取的文件流

     //chunk 是 Buffer 

    str += chunk.toString('binary') //将文件流转换为二进制数据

  })

  fileReader.on('end',() => { //文件流读取完成

    //将读取完成的文件数据保存数据库或者其他

   let body = {

   file: str,

type: filetype,

name: filename

}

  })

  ctx.body = {msg:'上传成功'}

}catch(err){

  console.log(err)

  ctx.body = err

}

})

//下载接口

router.post('/fileInfo/load', async (ctx) => {

//查询文件数据

let body = {

   file: file,

type: filetype,

name: filename

}

  let buffer = Buffer.from(body.file ,'binary')  //将文件数据转换为二进制

  ctx.body =  {

    file: buffer ,

    name: body.name,

    type: body.type

  }

})

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值