5

流程图 — 后面再补出来

写在前面,先贴上github demo源码地址https://github.com/LaputaGit/...,这个demo主要将文件处理的简单实例从前端到后端的流程交代了一遍,使用koa,js,pug,koa比express轻量很多,而且async用起来很友好,pug是一款很炫酷的后端模板引擎,你值得拥有,代码里面有注释,理解起来很方便

1、前端处理文件上传

1.1、调用API

前端上传文件,可以调用FormData()这个方法,详情参考MDNhttps://developer.mozilla.org...

通过FormData对象可以组装一组用 XMLHttpRequest发送请求的键/值对。它可以更灵活方便的发送表单数据,因为可以独立于表单使用。如果你把表单的编码类型设置为multipart/form-data ,则通过FormData传输的数据格式和表单通过submit() 方法传输的数据格式相同

就像这样,一个基础的文件上传js代码

document.querySelector('button').onclick = () => {
    const formData = new FormData()
      formData.append('uploadfile', document.querySelector('input').files[0])
      axios({
        url:'http://localhost:3003', // 此处填上服务器对应的地址(有路由把路由加上)
        method:'post',
        data:formData,
        headers: {'Content-Type': 'multipart/form-data'}  // 一定要设置请求头类型为'multipart/form-data',否则nodejs会解析错误
      }).then(res => {
          console.log(res.data)
          // 在上传图片成功,并且后端保存图片之后,再将图片以url的方式返回给前端,这样前端可以直接使用
          document.querySelector('img').src = res.data.imageUrl
      })
}

MDN中有详细基础实例,这里就不介绍了,也可参考我github demo中/public/index.js这个文件

2、后端处理文件

2.1、利用koa构建一个基本的后端服务用作测试

利用koa2 + pug 搭建了一个简单的项目,用到了koa-views, koa-static, koa-body等关键中间件,涉及到一些跨域和路由的处理,以及文件API的调用,代码里面有详细注释

启动

  • node server.js
  • 打开localhost:3003
  • 上传一张小图片之后可以在控制台查看nodejs的打印信息,以及在chrome控制台查看前端的请求和响应

server.js

const Koa = require('koa')
const app = new Koa() // 实例化Koa对象
const router = require('koa-router')() // 路由中间件
const cors = require('koa-cors')  // 处理cors跨域中间件
const fs = require('fs')  // 原生fs模块
const path = require('path')  // 原生path模块
const views = require('koa-views')  // 渲染模板引擎中间件 - 渲染pug

/**
 * 要对前端发来的'multipart/form-data'类型的文件进行解析,不然无法得到正确的解析结果
 * 并且设置文件保存路径,文件到服务器之后,会解析之后会被保存到public文件夹下
 */
const koaBody = require('koa-body')({ 
    multipart: true,  // 允许解析'multipart/form-data'类型的文件
    formidable: {
        uploadDir: path.join(__dirname, 'public')  // 设置文件上传保存路径
    }
})

app.use(cors()) // 跨域中间件

// nodejs不像apache和php,它天生没有web容器,所以需要中间件来提供
app.use(require('koa-static')('./public'))  // 提供静态服务

// 设置模板引擎的路径,并且告知类型为pug模板
app.use(views(path.join(__dirname, './view'), { extension: 'pug' }))

// 请求根路由,返回首页index.html
router.get('/', async (ctx) => {
    await ctx.render('index.pug')
})

// 处理前端post发送过来的数据
router.post('/', koaBody, async ( ctx ) => {
    console.log(ctx.request.body.files.uploadfile) // uploadfile为前端发送过来的文件名

    // 拿到前端发送过来的文件名,并且对node保存的文件,改为和文件名一致
    let imageName = ctx.request.body.files.uploadfile.name
    fs.rename(ctx.request.body.files.uploadfile.path, path.join(__dirname, 'public/images/') + ctx.request.body.files.uploadfile.name, () => {
        console.log('图片上传ok')
    })

    ctx.set('Content-Type', 'image/png') // 设置返回给前端的类型
    // 返回给前端json数据
    ctx.body = {
        text: '图片上传成功',
        imageUrl: `http://localhost:3003/images/${imageName}` // imageUrl是利用静态服务生成的图片的地址,可直接在浏览器请求到这个图片
    }
})

// 路由中间件使用
app
  .use(router.routes())
  .use(router.allowedMethods())

app.listen(3003)
console.log('[demo] start-quick is starting at port 3003')

index.pug

doctype html
html(lang="pug")
    head
        title="index"
        script(type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.17.1/axios.js")
        body
            div
                input(type="file" id="userfile")
                div
                    button 发送文件
                image(alt="图片暂时为空")
                script(src="index.js")
    body

2.3、文件的存放

后端在接收到前端上传给服务器的资源后,一般会保存在服务器内存,或者是数据库中,这中间涉及到的一些文件操作以及和数据库的交互,在理解buffer和编码格式的基础后,理解起来就不费劲了

2.4、文件返回给前端

昨天跟公司的后端讨论了一个需求:后端给前端返回json,前端负责将json渲染成pdf或者xls的格式,后面有时间我再把这部分实现出来放到github中,欢迎大家讨论和star,如有理解不当,欢迎指正


Ashin
373 声望12 粉丝

知识珍贵度排名:


引用和评论

0 条评论