流程图 — 后面再补出来javascript
写在前面,先贴上github demo源码地址https://github.com/LaputaGit/...,这个demo主要将文件处理的简单实例从前端到后端的流程交代了一遍,使用koa,js,pug,koa比express轻量不少,并且async用起来很友好,pug是一款很炫酷的后端模板引擎,你值得拥有,代码里面有注释,理解起来很方便php
前端上传文件,能够调用FormData()这个方法,详情参考MDNhttps://developer.mozilla.org...html
经过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这个文件java
利用koa2 + pug 搭建了一个简单的项目,用到了koa-views, koa-static, koa-body等关键中间件,涉及到一些跨域和路由的处理,以及文件API的调用,代码里面有详细注释node
server.jsios
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.puggit
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
后端在接收到前端上传给服务器的资源后,通常会保存在服务器内存,或者是数据库中,这中间涉及到的一些文件操做以及和数据库的交互,在理解buffer和编码格式的基础后,理解起来就不费劲了github
昨天跟公司的后端讨论了一个需求:后端给前端返回json,前端负责将json渲染成pdf或者xls的格式,后面有时间我再把这部分实现出来放到github中,欢迎你们讨论和star,若有理解不当,欢迎指正web