使用RESTful API与Angular,ng-file-upload异步上传文件

时间:2015-05-04 20:27:39

标签: javascript php angularjs ng-file-upload

我有一个表单,其中一些表单字段是文件上传。这就是我所拥有的:

  1. 用户填写表格
  2. 用户选择要提交的文件
  3. 用户按提交
  4. 现在,这就是我想要做的事情:

    1. 将表单发布到服务器,获取ID
    2. 将文件1发布到服务器myresource / ID / fileone
    3. 将文件二发布到服务器myresource / ID / filetwo ...
    4. ¿如何以编程方式执行此文件上传? (我正在使用角度承诺,因此顺序请求没有问题......)

      这是我的代码:

      $scope.upload = function (files, url) {
            if (files && files.length) {
              for (var i = 0; i < files.length; i++) {
                var file = files[i];
                Upload.upload({
                  url: url,
                  //fields: {'username': $scope.username},
                  file: file
                }).progress(function (evt) {
                  var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
                  console.log('progress: ' + progressPercentage + '% ' + evt.config.file.name);
                }).success(function (data, status, headers, config) {
                  console.log('file ' + config.file.name + 'uploaded. Response: ' + data);
                });
              }
            }
          };
      

      我的HTML:

      <input type="file" class="btn btn-danger" ng-file-select ng-model="files" ng-multiple="multiple"> Doit!
      
      <input class="btn btn-danger" ng-file-select ng-model="files" ng-multiple="multiple">Doit too!
      

1 个答案:

答案 0 :(得分:3)

好的,所以我终于明白了。

我这样做了:

  1. 在ng-model中选择文件和存储文件
  2. 验证一些内容
  3. 提交主模型(拥有我要上传的文件的人)
  4. 将文件上传到端点/ api / myentity / {id} / resumee,/ api / myentity / {id} / dni和/ api / myentity / {id} / picture。其中{id}是我刚在上一步中创建的实体的ID。
  5. 因此,这里的技巧是执行两个请求,一个用于创建实体并检索id,第二个用于上传文件。

    代码如下所示:

    // This is called every time the user selects a file
    $scope.selectedFile = function (files, doc) {
          if (doc === 'resumee') $scope.documents.resumee = files.pop();
          else if (doc === 'dni') $scope.documents.dni = files.pop();
          else if (doc === 'picture') $scope.documents.picture = files.pop();
    };
    
    // This is called when the user submits the form
    $scope.upload = function (docname, url) {
    
          var file = $scope.stepThree.documents[docname];
    
          return Upload.upload({
            url: url,
            method: 'POST',
            headers: {'Content-Type': file.type},
            fileFormDataName: docname,
            data: file,
            file: file
          }).progress(function (evt) {
            var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
            console.log('progress: ' + progressPercentage + '% ' + evt.config.file.name);
          });
        };
    

    最后,标记是这样的:

    <div class="form-horizontal">
            <div class="form-group">
              <div class="col-sm-2">
                <label> Resumen Curricular </label>
              </div>
              <div class="col-sm-2">
                <button class="btn btn-danger" ngf-select ngf-change="selectFile($files, 'resumee')"> Seleccione</button>
                <p>{{stepThree.documents.resumee.name}}</p>
              </div>
            </div>
     </div>
    

    由于没有人评论这种方法/技术,我将把它作为世界上使用文件上传,角度和REST API的最佳方式。