2015-06-28 58 views
5

我在angularjs上使用$ http,并且我有一个相当大的请求发送。

我想知道是否有办法做这样的事情:

content = "I'm a very long content string!" 
$http.post content, url, 'gzip' 

,并有发布请求的内容自动gzip压缩,并添加适当的请求头,这样服务器就知道解压内容并将其正确传递到控制器

我可以gzip我的内容,并在服务器上手动重新打开它,但我认为应该有一些方法来自动执行它。在那儿?

+0

将这项工作,为您的目的是什么? http://onehungrymind.com/zip-parsing-jszip-angular/ 这是jszip:https://stuk.github.io/jszip/ – Boris

+0

这是一个很酷的软件包,但它是关于在客户端打开一个zip文件,我希望我的文本被压缩到发送请求到服务器 – Yossale

+0

好吧,这是有道理的;也许js-deflate可能会工作:https://github.com/dankogai/js-deflate 看来其他人也对此感兴趣,但客户端 - 服务器通信并不容易:https://stackoverflow.com/questions/424917/why-cant-browser-send-gzip-request – Boris

回答

0

this后,这样你可以给模型上的参数,以便服务器可以决定如果内容是一个文件,如果文件应解压的第一

function Ctrl($scope, $http) { 

    //a simple model to bind to and send to the server 
    $scope.model = { 
     gzip: true, 
     file: true 
    }; 

    //an array of files selected 
    $scope.files = []; 

    //listen for the file selected event 
    $scope.$on("fileSelected", function (event, args) { 
     $scope.$apply(function() {    
      //add the file object to the scope's files collection 
      $scope.files.push(args.file); 
     }); 
    }); 

    //the save method 
    $scope.save = function() { 
     $http({ 
      method: 'POST', 
      url: "/Api/PostStuff", 
      //IMPORTANT!!! You might think this should be set to 'multipart/form-data' 
      // but this is not true because when we are sending up files the request 
      // needs to include a 'boundary' parameter which identifies the boundary 
      // name between parts in this multi-part request and setting the Content-type 
      // manually will not set this boundary parameter. For whatever reason, 
      // setting the Content-type to 'false' will force the request to automatically 
      // populate the headers properly including the boundary parameter. 
      headers: { 'Content-Type': false }, 
      //This method will allow us to change how the data is sent up to the server 
      // for which we'll need to encapsulate the model data in 'FormData' 
      transformRequest: function (data) { 
       var formData = new FormData(); 
       //need to convert our json object to a string version of json otherwise 
       // the browser will do a 'toString()' on the object which will result 
       // in the value '[Object object]' on the server. 
       formData.append("model", angular.toJson(data.model)); 
       //now add all of the assigned files 
       for (var i = 0; i < data.files; i++) { 
        //add each file to the form data and iteratively name them 
        formData.append("file" + i, data.files[i]); 
       } 
       return formData; 
      }, 
      //Create an object that contains the model and files which will be transformed 
      // in the above transformRequest method 
      data: { model: $scope.model, files: $scope.files } 
     }). 
     success(function (data, status, headers, config) { 
      alert("success!"); 
     }). 
     error(function (data, status, headers, config) { 
      alert("failed!"); 
     }); 
    }; 
};