AngularJS上传文件的示例代码


Posted in Javascript onNovember 10, 2018

使用AngularJS上传文件

  • 前台是Angular页面
  • 后台使用SpringBoot/SpirngMVC

上传文件

html

<div>
  <input id="fileUpload" type="file" />
  <button ng-click="uploadFile()">上传</button>
</div>

js

$scope.upload = function(){
      var form = new FormData();
      var file = document.getElementById("fileUpload").files[0];
      form.append('file', file);
      $http({
        method: 'POST',
        url: '/upload',
        data: form,
        headers: {'Content-Type': undefined},
        transformRequest: angular.identity
      }).success(function (data) {
        console.log('upload success');
      }).error(function (data) {
         console.log('upload fail');
      })
    }

注意:

  • AngularJS默认的'Content-Type'是application/json ,通过设置'Content-Type': undefined,这样浏览器不仅帮我们把Content-Type 设置为 multipart/form-data,还填充上当前的boundary,
  • 如果手动设置为:'Content-Type': multipart/form-data,后台会抛出异常:the request was rejected because no multipart boundary was found
  • boundary 是随机生成的字符串,用来分隔文本的开始和结束
  • 通过设置 transformRequest: angular.identity ,anjularjs transformRequest function 将序列化我们的formdata object,也可以不添加

后台

@RequestMapping("/upload")
  public void uploadFile(@RequestParam(value = "file" , required = true) MultipartFile file) {
    //deal with file
  }

注意

文件必须通过@RequestParam注解来获取,且需指定value才能获取到

这样就完成了上传文件

上传文件的同时传递其他参数

html

<div>
    <input id="fileUpload" type="file" />
    <button ng-click="ok()">上传</button><br>
    <input ng-model="user.username" />
    <input ng-model="user.password" />
  </div>

js

$scope.ok = function () {
    var form = new FormData();
    var file = document.getElementById("fileUpload").files[0];  
    var user =JSON.stringify($scope.user);

    form.append('file', file);
    form.append('user',user);

    $http({
      method: 'POST',
      url: '/addUser',
      data: form,
      headers: {'Content-Type': undefined},
      transformRequest: angular.identity
    }).success(function (data) {
      console.log('operation success');
    }).error(function (data) {
      console.log('operation fail');
    })
  };

注意

需要将Object转为String后在附加到form上,否则会直接被转为字符串[Object,object]

后台

@RequestMapping("/upload")
  public Map<String, Object> upload(@RequestParam(value = "file") MultipartFile file, @RequestParam(value = "user", required = true) String user) {

    try (FileInputStream in = (FileInputStream) headImg.getInputStream();
       FileOutputStream out = new FileOutputStream("filePathAndName")) {

      //将Json对象解析为UserModel对象
      ObjectMapper objectMapper = new ObjectMapper();
      UserModel userModel = objectMapper.readValue(user, UserModel.class);

      //保存文件到filePathAndName
      int hasRead = 0;
      byte[] bytes = new byte[1024];
      while ((hasRead = in.read(bytes)) > 0) {
        out.write(bytes, 0, hasRead);
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

注意

ObjectMapper为com.fasterxml.jackson.databind.ObjectMapper

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js带按钮的提示框可供选择示例代码
Sep 17 Javascript
JS实现让网页背景图片斜向移动的方法
Feb 25 Javascript
javascript实现可拖动变色并关闭层窗口实例
May 15 Javascript
深入解读JavaScript中的Hoisting机制
Aug 12 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
Jun 29 Javascript
JavaScript数据类型学习笔记分享
Sep 01 Javascript
js实现数组去重方法及效率?Ρ? target=
Feb 14 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
Jul 26 Javascript
使用canvas进行图像编辑的实例
Aug 29 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
Sep 12 jQuery
vue2.0学习之axios的封装与vuex介绍
May 28 Javascript
JavaScript实现留言板案例
Mar 17 Javascript
详解vue-cli 3.0 build包太大导致首屏过长的解决方案
Nov 10 #Javascript
优雅的在React项目中使用Redux的方法
Nov 10 #Javascript
Vue组件之单向数据流的解决方法
Nov 10 #Javascript
详解如何制作并发布一个vue的组件的npm包
Nov 10 #Javascript
如何在基于vue-cli的项目自定义打包环境
Nov 10 #Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
Nov 10 #Javascript
node+express框架中连接使用mysql(经验总结)
Nov 10 #Javascript
You might like
海贼王:最美的悬赏令!
2020/03/02 日漫
星际争霸兵种名称对照表
2020/03/04 星际争霸
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
php引用地址改变变量值的问题
2012/03/23 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
PHP处理Oracle的CLOB实例
2014/11/03 PHP
PHP进程同步代码实例
2015/02/12 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
js防止表单重复提交的两种方法
2013/09/30 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
jQuery zTree树插件简单使用教程
2017/01/10 Javascript
Bootstrap实现各种进度条样式详解
2017/04/13 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
JS中mouseup事件丢失的原因与解决办法
2017/06/14 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
three.js实现炫酷的全景3D重力感应
2018/12/30 Javascript
swiper实现异形轮播效果
2019/11/28 Javascript
[38:32]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第二局
2016/02/26 DOTA
python的常见命令注入威胁
2013/02/18 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
python如何保证输入键入数字的方法
2019/08/23 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
2019/08/26 Python
Python数据可视化实现多种图例代码详解
2020/07/14 Python
美国Max仓库:Max Warehouse
2020/05/31 全球购物
Skechers越南官方网站:来自美国的运动休闲品牌
2021/02/22 全球购物
南京某软件公司的.net面试题
2015/11/30 面试题
init进程的作用
2015/08/20 面试题
大专应届生个人的自我评价
2013/11/21 职场文书
淘宝文案策划岗位职责
2015/04/14 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
教师节大会主持词
2015/07/06 职场文书
合同范本之电脑出租
2019/08/13 职场文书