zoukankan      html  css  js  c++  java
  • Angularjs+Nodejs图片上传

    1.插件

      (1) :angular插件 ng-file-upload

      (2) : nodejs插件connect-multiparty

    2.html

    <input type="file"  ngf-select ng-model="files" ngf-multiple="true" />

    3.配置

    var app = angular.module('fileUpload', ['ngFileUpload']);
    可以参考https://github.com/danialfarid/ng-file-upload
     1 //inject angular file upload directives and services.
     2 var app = angular.module('fileUpload', ['ngFileUpload']);
     3 
     4 app.controller('MyCtrl', ['$scope', 'Upload', function ($scope, Upload) {
     5     $scope.$watch('files', function () {
     6         $scope.upload($scope.files);
     7     });
     8     // set default directive values
     9     // Upload.setDefaults( {ngf-keep:false ngf-accept:'image/*', ...} );
    10     $scope.upload = function (files) {
    11         if (files && files.length) {
    12             for (var i = 0; i < files.length; i++) {
    13                 var file = files[i];
    14                 Upload.upload({
    15                     url: 'url',   //此处url为向后台nodejs请求的路由
    16                     fields: {'username': $scope.username},
    17                     file: file
    18                 }).progress(function (evt) {
    19                     var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
    20                     console.log('progress: ' + progressPercentage + '% ' + evt.config.file.name);
    21                 }).success(function (data, status, headers, config) {
    22                     console.log('file ' + config.file.name + 'uploaded. Response: ' + data);
    23                 }).error(function (data, status, headers, config) {
    24                     console.log('error status: ' + status);
    25                 })
    26             }
    27         }
    28     };
    29 }]);

    4.nodejs

    后台接收的数据是存在于临时文件夹内。因此使用fs.rename()有肯能会报错。(我这边是确确实实报错了)

     1 var multipart = require('connect-multiparty');
     2 var fs = require('fs');
     3 var multipartMiddleware = multipart();
     4 
     5 
     6 
     7 
     8 
     9 
    10   //此处'/url'应与angular发送的路由一致,
    11   router.post('/url', multipartMiddleware,function(req, res, next){
    12         
    13      var profile_image = req.files.file;
    14      var tmp_path = profile_image.path;  //此处为页面图片存放的地址,在C盘的临时文件夹temp下。   
    15      console.log(req.files);
    16      var path = './url' + profile_image.name;  //此处'./url'为上传的图片希望存放的地址.可以为绝对地址
    17           
    18             //跨域传递文件
    19             var is = fs.createReadStream(tmp_path);
    20             var os = fs.createWriteStream(path);
    21                 is.pipe(os);
    22                 is.on('end',function() {
    23                     fs.unlinkSync(tmp_path);
    24                 });
    25             //跨域传递文件
    26        //-----------此处可以写点传递回前台的数据   --------此处不完整,不能完全照搬。如果写全的话,太麻烦。
    27   });

         从最开始的不懂,到后面逐渐把坑填满,花费了太多时间。里面的坑着实不少,能走通一次后,回头再看,代码量就那么点。写一下我犯过的错误吧.

        1.插件版本错误。之前的插件貌似叫做angular-file-upload.悲催的我拿着ng-file-upload,却用angular-file-upload的写法。

        2.angular-file-upload需要在用到的congtroller加载'$upload',而ng-file-upload加载'Upload'.

        3.angular-file-upload加载中间件的名称是['angularFileUpload'],而ng-file-upload加载['ngFileUpload']

        4.nodejs接收不到 req.files.file.一个原因是nodejs插件选择有问题,还有一个原因是插件的写法有问题.个人倾向于使用connect-multiparty.

        5.nodejs的fs.rename()方法报错。猜测:因为上传的图片存在于C盘的临时文件夹内,可能涉及到系统权限的问题导致fs.rename()方法报错。所以,从网上搜了一个跨域读取文件的方法。

  • 相关阅读:
    排序题目
    力扣二分法题目
    力扣动态相似题目
    875爱吃香蕉的珂珂
    410分割数组的最大值
    1335工作计划的最低难度
    287寻找重复数
    69X的平方根
    力扣相似题目
    解决Linux虚拟机内 /mnt/hgfs路径下文件为空问题
  • 原文地址:https://www.cnblogs.com/maduar/p/4700683.html
Copyright © 2011-2022 走看看