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 相关文章推荐
javascript里模拟sleep(两种实现方式)
Jan 25 Javascript
Jquery 自定义动画概述及示例
Mar 29 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
Apr 14 Javascript
JavaScript去除数组里重复值的方法
Jul 13 Javascript
jQuery中(function($){})(jQuery)详解
Jul 15 Javascript
Javascript仿新浪游戏频道鼠标悬停显示子菜单效果
Aug 21 Javascript
基于Jquery实现万圣节快乐特效
Nov 01 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
Apr 26 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
Sep 24 Javascript
Javascript农历与公历相互转换的简单实例
Oct 09 Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
Feb 02 Javascript
JS数组进阶示例【数组的几种函数用法】
Jan 16 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
深入for,while,foreach遍历时间比较的详解
2013/06/08 PHP
深入理解PHP中的Session和Cookie
2013/06/21 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
javawscript 三级菜单的实现原理
2009/07/01 Javascript
JQuery浮动DIV提示信息并自动隐藏的代码
2010/08/29 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
使用js Math.random()函数生成n到m间的随机数字
2014/10/09 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
详解基于Vue2.0实现的移动端弹窗(Alert, Confirm, Toast)组件
2018/08/02 Javascript
webpack 静态资源集中输出的方法示例
2018/11/09 Javascript
vue中typescript装饰器的使用方法超实用教程
2019/06/17 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
用Python制作简单的朴素基数估计器的教程
2015/04/01 Python
Python3 获取一大段文本之间两个关键字之间的内容方法
2018/10/11 Python
小白入门篇使用Python搭建点击率预估模型
2018/10/12 Python
解决python 未发现数据源名称并且未指定默认驱动程序的问题
2018/12/07 Python
Python提取频域特征知识点浅析
2019/03/04 Python
Python Django 命名空间模式的实现
2019/08/09 Python
tensorflow mnist 数据加载实现并画图效果
2020/02/05 Python
通过python检测字符串的字母
2020/02/18 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
HTML5 常用语法一览(列举不支持的属性)
2010/01/26 HTML / CSS
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
adidas瑞典官方网站:购买阿迪达斯鞋子和运动服
2019/12/11 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
美术教师个人工作总结
2015/02/06 职场文书
KTV员工管理制度
2015/08/06 职场文书
2016年“我们的节日·中秋节”活动总结
2016/04/05 职场文书
Go 语言中 20 个占位符的整理
2021/10/16 Golang
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL