Egg.js 中 AJax 上传文件获取参数的方法


Posted in Javascript onOctober 10, 2018

依赖

formidable

代码

前端

<fieldset style="margin: 20px; padding: 20px;">
 <legend>单文件,Ajax</legend>
 <form id="form3">
  <div>
   <input type="text" id="customName" placeholder="自定义文件名" />
  </div>
  <div>
   <input type="file" class="file" />
  </div>
  <div>
   <input type="submit" value="上传">
  </div>
 </form>
</fieldset>

<fieldset style="margin: 20px; padding: 20px;">
 <legend>多文件,Ajax</legend>
 <form id="form4">
  <div>
   <input type="file" class="file" multiple />
  </div>
  <div>
   <input type="submit" value="上传" />
  </div>
 </form>
</fieldset>
<script>
 $(function () {
  const _csrf = "{{ ctx.csrf | safe }}";
  $('form').submit(function (e) {
   e.preventDefault();
   const formData = new FormData();
   const fileList = $(this).find('.file')[0].files;
   let index = 0;
   for (let key of fileList) {
    formData.append('file' + index, key);
    index++
   }
   formData.append('isAjax', 'yes');
   formData.append('customName', $(this).find('#customName').val() || '');
   $.ajax({
    url: '/admin/file/upload?_csrf=' + _csrf,
    data: formData,
    method: 'POST',
    contentType: false,
    processData: false,
    success: function (result) {

    },
    error: function (responseStr) {
     alert("error", responseStr);
    }
   });
  });
 });
</script>

Node

'use strict';
const fs = require('fs');
const path = require('path');
const awaitWriteStream = require('await-stream-ready').write;
const sendToWormhole = require('stream-wormhole');
const formidable = require("formidable");
const Controller = require('../../core/base_controller');
class FileController extends Controller {
 async parse(req) {
  const form = new formidable.IncomingForm();
  return new Promise((resolve, reject) => {
   form.parse(req, (err, fields, files) => {
    resolve({ fields, files })
   })
  });
 }
 /**
 * 上传文件,兼容单文件和多文件
 * @param customName 单文件自定义文件名
 * @param isAjax 上传方式
 */
 async upload() {
  const { ctx, logger } = this;
  const extraParams = await this.parse(ctx.req);
  let { multipleFile, customName, isAjax } = extraParams && extraParams['fields'];
  logger.info(multipleFile, customName, isAjax);
  if (isAjax === 'yes') {
   const urls = [];
   for (let key in extraParams.files) {
    const file = extraParams.files[key];
    logger.info('file.name', file.name);
    logger.info('customName', customName);
    const stream = fs.createReadStream(file.path);
    const fileName = customName ? (customName + path.extname(file.name)) : file.name;
    const target = path.join(this.config.baseDir, 'app/public/upload', fileName);
    const writeStream = fs.createWriteStream(target);
    try {
     await awaitWriteStream(stream.pipe(writeStream));
    } catch (err) {
     await sendToWormhole(stream);
     throw err;
    }
    urls.push(target);
   }
   this.success({ urls })
  }
 }
}
module.exports = FileController;

总结

以上所述是小编给大家介绍的Egg.js 中 AJax 上传文件获取参数,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js 表单验证方法(实用)
Apr 28 Javascript
jQuery添加和删除指定标签的方法
Dec 16 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
Jan 10 Javascript
javascript基本语法
May 31 Javascript
深入分析javascript中console命令
Aug 14 Javascript
JS+Ajax实现百度智能搜索框
Aug 04 Javascript
浅谈Express异步进化史
Sep 09 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
Nov 17 Javascript
js实现多张图片每隔一秒切换一张图片
Jul 29 Javascript
layui之table checkbox初始化时选中对应选项的方法
Sep 02 Javascript
webpack3升级到webpack4遇到问题总结
Sep 30 Javascript
html+vue.js 实现漂亮分页功能可兼容IE
Nov 07 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
Oct 10 #Javascript
解决eclipse中没有js代码提示的问题
Oct 10 #Javascript
js实现同一个页面,多个enter事件绑定的示例
Oct 10 #Javascript
在React项目中使用Eslint代码检查工具及常见问题
Oct 10 #Javascript
jquery实现联想词搜索框和搜索结果分页的示例
Oct 10 #jQuery
Vue 重置组件到初始状态的方法示例
Oct 10 #Javascript
15个顶级开源JavaScript框架和库
Oct 10 #Javascript
You might like
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
JQuery Tips(3) 关于$()包装集内元素的改变
2009/12/14 Javascript
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
js分解url参数(面向对象-极简主义法应用)
2012/08/09 Javascript
JQuery实现点击div以外的位置隐藏该div窗口
2013/09/13 Javascript
JQuery悬停控制图片轮播——代码简单
2015/08/05 Javascript
jQuery仿写百度百科的目录树
2017/01/03 Javascript
vue页面使用阿里oss上传功能的实例(二)
2017/08/09 Javascript
JavaScript实现带有子菜单和控件的slider轮播图效果
2017/11/01 Javascript
JavaScript常用截取字符串的三种方式用法区别实例解析
2018/05/15 Javascript
微信小程序自定义tabBar的踩坑实践记录
2020/11/06 Javascript
python中set常用操作汇总
2016/06/30 Python
python爬虫入门教程--利用requests构建知乎API(三)
2017/05/25 Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
2017/12/14 Python
Python中 map()函数的用法详解
2018/07/10 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
Python编程在flask中模拟进行Restful的CRUD操作
2018/12/28 Python
python 自动批量打开网页的示例
2019/02/21 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
详解python持久化文件读写
2019/04/06 Python
利用Django模版生成树状结构实例代码
2019/05/19 Python
numpy:找到指定元素的索引示例
2019/11/26 Python
Python序列类型的打包和解包实例
2019/12/21 Python
Python unittest 自动识别并执行测试用例方式
2020/03/09 Python
基于Python和C++实现删除链表的节点
2020/07/06 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
2020/07/21 Python
python定义类的简单用法
2020/07/24 Python
Python threading模块condition原理及运行流程详解
2020/10/05 Python
美国知名男士服饰品牌:Brooks Brothers(布克兄弟)
2016/08/25 全球购物
Java面试题:请问一下代码输出是什么
2015/05/27 面试题
理工类毕业自我鉴定
2014/02/20 职场文书
离婚协议书样本
2015/01/26 职场文书
小学体育教学随笔
2015/08/14 职场文书
SpringCloud Alibaba项目实战之nacos-server服务搭建过程
2021/06/21 Java/Android