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与jQuery 获取父窗、子窗的iframe
Dec 20 Javascript
jQuery实用技巧必备(下)
Nov 03 Javascript
整理AngularJS框架使用过程当中的一些性能优化要点
Mar 05 Javascript
JS学习之表格的排序简单实例
May 16 Javascript
js插件dropload上拉下滑加载数据实例解析
Jul 27 Javascript
常用jQuery选择器汇总
Feb 02 Javascript
javascript实现非常简单的小数取整功能示例
Jun 13 Javascript
详解swiper在vue中的应用(以3.0为例)
Sep 20 Javascript
angularJs利用$scope处理升降序的方法
Oct 08 Javascript
详解Node.js读写中文内容文件操作
Oct 10 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
Dec 28 Javascript
一文了解JavaScript用Element Traversal新属性遍历子元素
Nov 27 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
基于PHP+MySQL的聊天室设计
2006/10/09 PHP
关于PHP开发的9条建议
2015/07/27 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
PHP编写RESTful接口的方法
2016/02/21 PHP
php处理多图上传压缩代码功能
2018/06/13 PHP
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
选择器中含有空格在使用示例及注意事项
2013/07/31 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
jQuery四种选择器使用及示例
2016/06/05 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
vue学习笔记之vue1.0和vue2.0的区别介绍
2017/05/17 Javascript
详解webpack解惑:require的五种用法
2017/06/09 Javascript
详解vue mint-ui源码解析之loadmore组件
2017/10/11 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
Vue.js单向绑定和双向绑定实例分析
2018/08/14 Javascript
详细分析Node.js 模块系统
2020/06/28 Javascript
用Python遍历C盘dll文件的方法
2015/05/06 Python
Python学习小技巧之列表项的排序
2017/05/20 Python
Python将8位的图片转为24位的图片实现方法
2018/10/24 Python
Python 如何操作 SQLite 数据库
2020/08/17 Python
html5 touch事件实现触屏页面上下滑动(二)
2016/03/10 HTML / CSS
极简的HTML5模版
2015/07/09 HTML / CSS
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
Athleta官网:购买女士瑜伽服、技术运动服和休闲运动服
2020/11/12 全球购物
法制宣传日活动总结
2014/04/29 职场文书
幸福家庭标语
2014/06/27 职场文书
放飞梦想演讲稿800字
2014/08/26 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
银行会计主管岗位职责
2014/10/01 职场文书
离婚协议书怎么写的
2014/12/14 职场文书
校园环境卫生倡议书
2015/04/29 职场文书
雨中的树观后感
2015/06/03 职场文书
Python基于百度API识别并提取图片中文字
2021/06/27 Python