koa2通过表单上传的网上很多,但通过Ajax方式上传文件,使用FormData进行Ajax请求,不好找。

参考了这个用base64上传图片的例子。https://github.com/Yuki-Minakami/Koa2-FormData

我的项目列表。

index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传</title>
<script src="https://code.jquery.com/jquery-1.12.4.min.js"
integrity="sha256-ZosEbRLbNQzLpnKIkEdrPv7lOy9C27hHQ+Xp8a4MxAQ="
crossorigin="anonymous">
</script>
</head>
<body>
<div style="margin-top: 1%;">
<input type="file" id="uploadingfile">
<br/><br/>
<button id="subbtn">提交</button>
<script>
$(function () {
$("#subbtn").on("click",function () {
let data = new FormData();
data.append("file",document.getElementById('uploadingfile').files[0]);
data.append("info","附带信息");
$.ajax({
url : "/uploadimgs",
type : "POST",
processData: false,
contentType: false,
data : data,
success : function(data){
console.log(data);
}
});
});
})
</script>
</div>
</body>
</html>

app.js

const Koa = require("koa");
const router = require("koa-router")();
const multiparty = require("multiparty");
const app = new Koa();
app.use(router.routes());
router.get("/",(ctx)=>{
ctx.body = require("fs").readFileSync("./index.html","utf-8");
});
let form = new multiparty.Form({uploadDir:'./images/' });
router.post('/uploadimgs',async (ctx) => {
async function loadimg() {
await form.parse(ctx.req,function(err,fields,files){
if(err){throw err; return;}
console.log(fields);//除文件外的其他附带信息
console.log(files);//文件信息
return ;
});
}
await loadimg().then(v=>{
ctx.body="上传成功";
});
});
app.listen(3000);
console.log("listen on 3000");

上面的app.js没做任何判断,就直接报成功,感觉不好,所以完善一下。

修改后的app.js

const Koa = require("koa");
const router = require("koa-router")();
const multiparty = require("multiparty");
const app = new Koa();
app.use(router.routes());
router.get("/",(ctx)=>{
ctx.body = require("fs").readFileSync("./index.html","utf-8");
}); router.post('/uploadimgs',async (ctx) => {
let errsign={status:500,exception:null};
let datasign={status:200,recordset:null};
function loadimg() {
let send_json={};
return new Promise((resolve,reject)=>{
let form = new multiparty.Form({uploadDir:'./images/' });
form.parse(ctx.req,function(err,fields,files){
if(err){
// throw err;
console.log(err);//Error: write after end
send_json={
exception:"解析失败",
err:false
};
resolve(send_json);
// return send_json;
}else{
// console.log(fields);//除文件外的其他附带信息
// console.log("files = ",files);//文件信息
if(files!==undefined&&files!=={}&&files.file!==undefined){
// console.log(files.file);
if(files.file.length>0){
let filename = files.file[0].path;
let filetype = files.file[0].headers['content-type'];
let realname = files.file[0].originalFilename;
// console.log("filename = ",filename);
// console.log("filetype = ",filetype);
// console.log("realname = ",realname);
if(filetype.indexOf("image/")>=0){
send_json={
recordset:"上传成功",
err:true
};
resolve(send_json);
}else{
send_json={
exception:"上传失败",
err:false
};
fs.unlinkSync(filename);//删除非图片文件
resolve(send_json);
}
}
}else{
send_json={
exception:"未上传文件",
err:false
};
resolve(send_json);
}
}
});
});
}
await loadimg().then(r=>{
// console.log("r = ",r);
if(r.err===false){
errsign["exception"]=r.exception;
ctx.body=errsign;
}else{
datasign["recordset"]=r.recordset;
ctx.body=datasign;
}
});
});
app.listen(3030);
console.log("listen on 3030");

  

koa2:通过Ajax方式上传文件,使用FormData进行Ajax请求的更多相关文章

  1. Ajax方式上传文件

    用到两个对象 第一个对象:FormData 第二个对象:XMLHttpRequest 目前新版的Firefox 与 Chrome 等支持HTML5的浏览器完美的支持这两个对象,但IE9尚未支持 For ...

  2. 通过Ajax方式上传文件,使用FormData进行Ajax请求

    通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...

  3. [转] 通过Ajax方式上传文件,使用FormData进行Ajax请求

    通过传统的form表单提交的方式上传文件: <form id= "uploadForm" action= "http://localhost:8080/cfJAX_ ...

  4. Ajax方式上传文件报错"Uncaught TypeError: Illegal invocation"

    今天使用ajax上传文件时,出现了错误.数据传输的方式是通过定义formData完成的,提交的文件对象也设置为dom对象,但是还是不能发送请求.F12看到后台报了个错误:Uncaught TypeEr ...

  5. 通过Ajax方式上传文件(input file),使用FormData进行Ajax请求

    <script type="text/jscript"> $(function () { $("#btn_uploadimg").click(fun ...

  6. 【2】通过Ajax方式上传文件(图片),使用FormData进行Ajax请求

    HTML: <form id= "uploadForm"> <p >指定文件名: <input type="text" name= ...

  7. jQuery Ajax方式上传文件实现暂停或取消上传

    未上传时要实现取消,很简单... 但如果用户点击了上传,并加载了进度信息... 2017-05-04再次改进.在上传过程中用户可以按 Esc 来取消上传(取消当前上传,或者是全部上传)... 也可以在 ...

  8. ajax如何上传文件(整理)

    ajax如何上传文件(整理) 一.总结 一句话总结:用FormData,FormData+ajax=异步上传二进制文件 <form enctype="multipart/form-da ...

  9. egg.js 通过 form 和 ajax 两种方式上传文件并自定义目录和文件名

    egg.js 通过 form 和 ajax 两种方式上传文件并自定义目录和文件名 评论:10 · 阅读:8437· 喜欢:0 一.需求 二.CSRF 校验 三.通过 form 表单上传文件 四.通过 ...

随机推荐

  1. Linux shell编程语法

    由于条件判断和循环跟其他语言都大同小异,学过编程的话很好理解,这里只贴出格式,不具体写用法了.(select菜单会详细讲一下) 条件判断 if条件判断 普通if条件判断: if 判断条件1; then ...

  2. EMI优化

    一般印刷电路板之间的高速信号线路无法通过FCC和VDE辐射测试. 优化方案有以下3种: 1.高频滤波 通常做法在每个逻辑驱动器上串联一个小阻抗,并经过一个旁路电容接地. 旁路电容接地需足够干净,如机箱 ...

  3. Java课程2019年3月开学测试

    一.登录界面 模板的验证方式已经写在了function里面,我们只需要在提交的过程中进行验证. 我们这里需要注意到的是在login文件夹中,有一个randcode的验证码生成文件,打开代码我们可以看到 ...

  4. window iis重启

    WINDOWS server 任务计划实现定时自动重启IIS编写批处理文件IIS.bat@echo offnet stop iisadmin /yesnet start iisadminnet sta ...

  5. ab 站点压力测试工具

    ab--压力测试工具 前端时间由于需要测试一个网站的高并发的情况,使用到了一个ab测试工具,下面是我自己的体验及参考网上别人的博客所写,希望对大家有所帮助. ab工具简介 ab 全称:apache b ...

  6. oralce 将浮点型字段,转为指定精度 并且四舍五入

    使用 Round()  函数,该函数有两个参数,第一个参数: 将要转换的字段,第二个参数:保留的小数点位数 1 代表保留1位 2 代表保留2位 例子: SELECT round(123.446,1) ...

  7. TCP三次握手四次挥手最通俗理解

    工作过程TCP标志位:TCP共有6个标志位,分别是: SYN(synchronous),建立联机.ACK(acknowledgement),确认.PSH(push),传输.FIN(finish),结束 ...

  8. 解决国内NPM安装依赖速度慢问题

      版权声明:本文为博主原创文章,转载请注明原文地址. http://blog.csdn.net/rongbo_j/article/details/52106580 不知道各位是否遇到这种情况,使用N ...

  9. java线程的学习

    接口 Runable 属性:target 方法:void run() 类 Thread 方法:void start()用来启动一个线程 void run() 线程启动后执行的方法 Sting getN ...

  10. java_基础_类加载

    类加载:Java命令的作用是启动虚拟机,虚拟机通过输入流,从磁盘上将字节码文件(.class文件)中的内容读入虚拟机,并保存起来的过程就是类加载. 类加载特性 :      *在虚拟机的生命周期中一个 ...