5

I'm using $http on angularjs, and I have a fairly big request to send.

I'm wondering if there a way to do something like this:

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

and have the post request content auto-gzipped and add an appropriate request header, so the server will know to unzip the content and pass it correctly to the controller

I can gzip the content on my side, and re-open it manually on the server, but I thought there should be some way to do it automatically. Is there?

5
  • Would this work for your purposes? onehungrymind.com/zip-parsing-jszip-angular Here is jszip: stuk.github.io/jszip Commented Jun 28, 2015 at 7:26
  • It's a cool package, but it's about opening a zip on the client, and I want my text to be zipped on the post request to the server Commented Jun 28, 2015 at 7:29
  • Ok that makes sense; perhaps js-deflate might work: github.com/dankogai/js-deflate It seems others are interested in this as well but the client-server communication does not make it easy: stackoverflow.com/questions/424917/… Commented Jun 28, 2015 at 7:36
  • did you ever solve this issue as I'm in a similar situation? Commented Dec 10, 2015 at 12:39
  • have a look at the following answer which goes into great detail on this topic: http://stackoverflow.com/a/34252371/6462840 Commented Aug 9, 2016 at 12:02

1 Answer 1

0

See this post, like that you could give a parameter on the model so the server can decide if the content is a file and if the file should be unziped first

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!");
        });
    };
};
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.