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初学困境—js初学
Dec 29 Javascript
javascript动态控制服务器控件实例
Sep 05 Javascript
js实现进度条的方法
Feb 13 Javascript
js记录点击某个按钮的次数-刷新次数为初始状态的实例
Feb 15 Javascript
AngularJS Toaster使用详解
Feb 24 Javascript
运用jQuery写的验证表单(实例讲解)
Jul 06 jQuery
js表单序列化判断空值的实例
Sep 22 Javascript
angular2 NgModel模块的具体使用方法
Apr 10 Javascript
jquery实现动态创建form并提交的方法示例
May 27 jQuery
vue+moment实现倒计时效果
Aug 26 Javascript
解决vue做详情页跳转的时候使用created方法 数据不会更新问题
Jul 24 Javascript
vue基于Teleport实现Modal组件
May 31 Vue.js
轻量级富文本编辑器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中Session的概念
2006/10/09 PHP
php实现背景图上添加圆形logo图标的方法
2016/11/17 PHP
通过 Dom 方法提高 innerHTML 性能
2008/03/26 Javascript
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
js实时获取系统当前时间实例代码
2013/06/28 Javascript
node.js适合游戏后台开发吗?
2014/09/03 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
js自定义回调函数
2015/12/13 Javascript
解析Node.js基于模块和包的代码部署方式
2016/02/16 Javascript
jQuery实现点击水纹波动动画
2016/04/10 Javascript
全面解析Bootstrap中nav、collapse的使用方法
2016/05/22 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
JavaScript的for循环中嵌套一个点击事件的问题解决
2017/03/03 Javascript
Easy UI动态树点击文字实现展开关闭功能
2017/09/30 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
python 调用c语言函数的方法
2017/09/29 Python
python操作oracle的完整教程分享
2018/01/30 Python
Python安装lz4-0.10.1遇到的坑
2018/05/20 Python
python实现指定字符串补全空格、前面填充0的方法
2018/11/16 Python
Numpy 中的矩阵求逆实例
2019/08/26 Python
python怎么自定义捕获错误
2020/06/29 Python
Chantelle仙黛尔内衣美国官网:法国第一品牌内衣
2018/07/26 全球购物
俄罗斯皮肤健康中心:Pharmacosmetica.ru
2020/02/22 全球购物
安全生产月宣传标语
2014/10/06 职场文书
导游词欢迎词
2015/02/02 职场文书
让子弹飞观后感
2015/06/11 职场文书
七年级作文之英语老师
2019/10/28 职场文书
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL
【海涛dota解说】海涛小满开黑4v5被破两路翻盘潮汐第一视角解说
2022/04/01 DOTA
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers
vue使用element-ui按需引入
2022/05/20 Vue.js