使用koa2搭建文件上传服务,后端代码

const os = require('os');
const path = require('path');
const koaBody = require('koa-body');
const Koa = require('koa');
const app = new Koa(); const fs = require("fs"); const main = async function(ctx) {
//const tmpdir = os.tmpdir(); //返回系统临时文件 const tmpdir = path.join(__dirname, "static"); const filePaths = [];
const files = ctx.request.files || {};
const params = ctx.request.body
console.log(params);
for (let key in files) {
const file = files[key];
if(Object.prototype.toString.call(file) == '[object Array]'){
for(var j = 0; j < file.length; j++ ){
witeFile(file[j]);
}
}else{
witeFile(file); }
}
function witeFile(file){
const filePath = path.join(tmpdir, file.name);
const reader = fs.createReadStream(file.path);
const writer = fs.createWriteStream(filePath);
reader.pipe(writer);
filePaths.push(filePath);
} ctx.body = filePaths;
}; app.use(koaBody({ multipart: true }));
app.use(main);
app.listen(3000);

  前端代码

		<form action="http://localhost:3000/" method="post" enctype="multipart/form-data">
<input type="text" name="name" id="" value="姓名" />
<input type="text" name="pwd" id="" value="123456" />
<input type="file" name="file" id="file" value="" multiple="multiple" />
<input type="submit" value="提交"/>
</form>  

使用ajax 上传

$("#file")[0].onchange = function(e){
console.log(this.files);
var filse = this.files;
var fd = new FormData();
fd.append("file",filse[0]);
$.ajax({
type:"post",
data:fd,
processData:false,
contentType:false,
url:"http://192.168.20.104:3000",
}).then(function(ret){
console.log(ret);
}).catch((e)=>{
console.log(e);
})
}

  

注意:

新版本的koa-body通过ctx.request.files获取上传的文件 
旧版本的koa-body通过ctx.request.body.files获取上传的文件

另外,附上express 的文件上传:

const multiparty = require('multiparty');

router.post('/file', function(req, res, next) {
//生成multiparty对象,并配置上传目标路径
const form = new multiparty.Form()
// //设置编辑
form.encoding = 'utf-8'
// //设置文件存储路径
form.uploadDir = "./public/static/"
// //设置单文件大小限制
//form.maxFilesSize = 2 * 1024 * 1024
// form.maxFields = 1000; 设置所以文件的大小总和
// 上传完成后处理 form.parse(req, (err, fields, files) => {
if (err) {
console.log("parse:",err);
res.json(configVar.fileUp);
} else {
const inputFile = files.file[0];
const uploadedPath = inputFile.path
var imgtype = inputFile.originalFilename;
const typarr = imgtype.split(".");
const typ = typarr[typarr.length -1];
const nm = new Date().getTime() + '' + Math.floor(Math.random()*1000000) ;
console.log(fields.old);
imgtype = nm + '.' + typ;
const inPath = `./public/static/${imgtype}`; //重命名的路径
// 判断是否存在./dist/static/files文件
fs.stat('./public/static', (err, stats) => {
if (JSON.stringify(stats) === undefined) {
fs.mkdirSync('./public/static')
}
storeFiles(uploadedPath, fields, inPath)
});
}
}); function storeFiles(uploadedPath, fields, inPath) {
//重命名为真实文件名
fs.rename(uploadedPath, inPath, (err) => {
if (err) {
console.log("rename:",err);
res.json(configVar.rename);
} else {
var ret = {
data:inPath.substring(8)
};
Object.assign(ret , configVar.success);
res.json(ret);
}
});
} });

  

koa2的文件上传的更多相关文章

  1. NodeJs koa2实现文件上传

    [转载自:]https://www.jianshu.com/p/34d0e1a5ac70 知识讲解 koa2框架是一个基于中间件的框架,也就是说,需要使用到的功能,比如路由(koa-router),日 ...

  2. koa2实现文件上传服务

    使用方法 方法一: 使用中间介 koa-body 方法二: 自己写个借口去接收数据流并保存 方法三: 使用 koa-body 接受文件,自己写个接口做文件保存或处理等操作 这里简单记录方法三 app. ...

  3. element-vue-koa2-mysql实现文件上传

    友情提示:这篇博客不会详细说明搭建过程 阅读群体建议:第一次使用node或者koa2写文件上传或者下载,因为你不知道用fs的哪个方法,我也是从fs里试水试了一天,各种百度才搞出来的,特别学过java的 ...

  4. koa2基于stream(流)进行文件上传和下载

    阅读目录 一:上传文件(包括单个文件或多个文件上传) 二:下载文件 回到顶部 一:上传文件(包括单个文件或多个文件上传) 在之前一篇文章,我们了解到nodejs中的流的概念,也了解到了使用流的优点,具 ...

  5. jquery.uploadify文件上传组件

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  6. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  7. Java FtpClient 实现文件上传服务

    一.Ubuntu 安装 Vsftpd 服务 1.安装 sudo apt-get install vsftpd 2.添加用户(uftp) sudo useradd -d /home/uftp -s /b ...

  8. 小兔Java教程 - 三分钟学会Java文件上传

    今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...

  9. ,net core mvc 文件上传

    工作用到文件上传的功能,在这个分享下 ~~ Controller: public class PictureController : Controller { private IHostingEnvi ...

随机推荐

  1. PAT甲级1139 First Contact

    题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805344776077312 题意: 有m对朋友关系,每个人用4为数 ...

  2. Codeforces 279C - Ladder - [简单DP]

    题目链接:http://codeforces.com/problemset/problem/279/C 题意: 给出 $n$ 个整数 $a[1 \sim n]$,$m$ 个查询,对于一个查询 $[l_ ...

  3. 进制转换 map

    a_z = [i for i in map(chr, range(ord('a'), ord('z') + 1))]'''Address of var1 variable: 240ff24Addres ...

  4. Laravel 5.2 INSTALL- node's npm and ruby's bundler.

    https://getcomposer.org/doc/00-intro.md Introduction# Composer is a tool for dependency management i ...

  5. [skill][c] *(char**)

    /* scmp: string compare of *p1 and *p2 */ int scmp(const void *p1, const void *p2) { char *v1, *v2; ...

  6. DBGridEh使用指南改变边框颜色

    DBGridEh使用指南 鹅倌0人评论422人阅读2012-08-06 15:17:59   1.设置表头,是否允许多表头,设置是否只读. dbgrdh1.TitleFont.Color:=clBlu ...

  7. 最全的MonkeyRunner自动化测试从入门到精通(1)

    一.环境变量的配置 1.JDK环境变量的配置 步骤一:在官网上面下载jdk,JDK官网网址: http://www.oracle.com/technetwork/java/javase/downloa ...

  8. 内存的一些magic number和debug crt(0xCCCCCCCC和0xCDCDCDCD,debug版本的CRT为了方便调试程序的初始值)

    调试过debug版本的vc程序的人一定对0xCCCCCCCC和0xCDCDCDCD这样的内存很有印象.这是debug版本的CRT为了方便调试程序,在分配出来还没有初始化的时候提供的初始值. 实际上,W ...

  9. Interceptor的基本介绍和使用

    简介 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了一种可以提取Act ...

  10. sqlite数据导入mysql

    sqlite导出数据 1.首先将sqlite数据库中的数据库格式由db或者db3等转为.sql格式,方法如下: 首先是不修改路径的情况下,在命令行下(方法一): sqlite3 database_na ...