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 相关文章推荐
jQuery的css()方法用法实例
Dec 24 Javascript
项目中常用的JS方法整理
Jan 30 Javascript
jQuery实现长按按钮触发事件的方法
Feb 02 Javascript
jQuery图片左右滚动代码 有左右按钮实例
Jun 20 Javascript
jQuery 获取页面li数组并删除不在数组中的key
Aug 02 Javascript
Angular之指令Directive用法详解
Mar 01 Javascript
js判断PC端与移动端跳转
Dec 24 Javascript
jQuery树插件zTree使用方法详解
May 02 jQuery
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
Aug 22 Javascript
Javascript快速实现浏览器系统通知
Aug 26 Javascript
jQuery实现注册会员时密码强度提示信息功能示例
Sep 05 jQuery
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
Dec 04 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中mail函数发送邮件失败的解决方法
2014/12/24 PHP
PHP实现的策略模式示例
2019/03/20 PHP
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
Jquery动态更改一张位图的src与Attr的使用
2013/07/31 Javascript
JQuery Highcharts 动态生成图表的方法
2013/11/15 Javascript
js模仿hover的具体实现代码
2013/12/30 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
2014/05/04 Javascript
js密码强度实时检测代码
2016/03/02 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
使用vue实现点击按钮滑出面板的实现代码
2017/01/10 Javascript
Vue作用域插槽slot-scope实例代码
2018/09/05 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
构建大型 Vue.js 项目的10条建议(小结)
2019/11/14 Javascript
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
Python中条件选择和循环语句使用方法介绍
2013/03/13 Python
在Django中创建第一个静态视图
2015/07/15 Python
django model去掉unique_together报错的解决方案
2016/10/18 Python
Flask框架实现给视图函数增加装饰器操作示例
2018/07/16 Python
Flask框架Flask-Principal基本用法实例分析
2018/07/23 Python
django之状态保持-使用redis存储session的例子
2019/07/28 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
python的命名规则知识点总结
2019/10/04 Python
python matplotlib 画dataframe的时间序列图实例
2019/11/20 Python
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
CAD制图人员的自荐信
2014/02/07 职场文书
大学生自我评价范文分享
2014/02/21 职场文书
技术合作协议书范本
2014/04/18 职场文书
慰问敬老院活动总结
2014/04/26 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
大学校园招聘会感想
2015/08/10 职场文书
给校长的建议书作文500字
2015/09/14 职场文书
六五普法学习心得体会
2016/01/21 职场文书
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js