【问题标题】:Example of progress on file upload in AngularJS $http POSTAngularJS $http POST 文件上传进度示例
【发布时间】:2013-09-22 11:55:33
【问题描述】:

我正在尝试从 AngularJS $http POST 请求中获取“进度”事件以进行文件上传。

查看$http upload file progress in AngularJS 之后,我遇到了一个最近的 angular.js git commit,它假设可以解决问题Add XHR progress event handling to $http and $httpBackend

有没有人完成这项工作?如果是这样,可以举个例子吗?

附言。我宁愿继续使用 $http 而不是创建我自己的 XMLHttpRequest。原因是我的后端希望将 json 对象与多部分文件数据相结合。并且通过 XMLHttpRequest 进行的尝试失败并出现错误消息,即后端看不到请求的 json 对象部分“所需的字符串参数 'objData' 不存在。客户端发送的请求在语法上不正确。”在 POST 消息中,我在 Firebug 中看到“Content-Disposition: form-data; name="objData"”。

   $scope.uploadFile = function() {
    var url = buildUrl('/upload');
    var data = {objData: $scope.data, fileData: $scope.file};
    var formData = new FormData();

    formData.append("objData", angular.toJson(data.objData));
    formData.append("fileData", data.fileData);

    var xhr = new window.XMLHttpRequest();

    xhr.upload.addEventListener("progress", uploadProgress, false);

    xhr.open("POST", url);
    xhr.setRequestHeader("Content-Type","application/json;charset=utf-8");
    xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    xhr.send(formData);
};

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    在撰写本文时,$http 不支持新的 1.2 $q 的通知方法。所以你必须使用jquery xhr。设置后相当简单:

    请注意,我们会返回一个承诺,以便您的 uploadFile 消费者会执行 uploadFile(..).then(success, fail, progress)

    $scope.uploadFile = function() {
      var deferred = $q.defer();
      var getProgressListener = function(deferred) {
        return function(event) {
          //do some magic
          deferred.notify(magic);
        };
      };
      var formData = new FormData();
    
      formData.append("objData", angular.toJson(data.objData));
      formData.append("fileData", data.fileData);
    
      $.ajax({
        type: 'POST',
        url: buildUrl('/upload'),
        data: formData,
        cache: false,
        // Force this to be read from FormData
        contentType: false,
        processData: false,
        success: function(response, textStatus, jqXHR) {
          deferred.resolve(response);
        },
        error: function(jqXHR, textStatus, errorThrown) {
          deferred.reject(errorThrown);
        },
        xhr: function() {
          var myXhr = $.ajaxSettings.xhr();
          if (myXhr.upload) {
             myXhr.upload.addEventListener(
                'progress', getProgressListener(deferred), false);
          } else {
            $log.log('Upload progress is not supported.');
          }
          return myXhr;
        }
      });
      return deferred.promise;
    };
    

    【讨论】:

    • 它似乎有效。但是你是如何在后端读取表单数据的,你能告诉我后端java代码来读取这个例子的表单数据吗
    • 我建议为此使用 Apache Commons FileUpload。 stackoverflow.com/questions/2422468/…的答案有一个非常好的和详细的解释。
    • request.getInputstream() 将提供上传文件的输入流..但我想直接在服务器端获取上传的文件,如我发送多部分的 uploadFile(HttpServletRequest req, CommonMultipartFile file)文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    相关资源
    最近更新 更多