Binary files corrupted - How to Download Binary Files with AngularJS












2















download any file using ResponseEntity with angular does not work



I need to download a file using angular in client side,
this file can have any format it could be a pdf or excel or image or txt ...
my method works just for txt files and gives me a fail format for excel and image and for the pdf it gives an empty pdf.



so in my controller here is the function that calles the service method:



    vm.downloadFile = downloadFile;

function downloadFile(file){
var urlDir = "C://STCI//"+idpeticion;
return VerDocServices.downloadFile(file,urlDir)
.then(function(response) {
var data = response.data;
var filename = file;
var contentType = 'application/octet-stream';//octet-stream
var linkElement = document.createElement('a');
try {
var blob = new Blob([ data ], {
type : contentType
});
var url = window.URL.createObjectURL(blob);
linkElement.setAttribute('href', url);
linkElement.setAttribute("download", filename);
var clickEvent = new MouseEvent("click", {
"view" : window,
"bubbles" : true,
"cancelable" : false
});
linkElement.dispatchEvent(clickEvent);
} catch (ex) {
console.log(ex);
throw ex;
}
}).catch(function(response) {
alert('Se ha producido un error al exportar del documento');
console.log(response.status);
throw response;
});
}


and my service.js has:



angular.module('mecenzApp').service('VerDocServices',['$http',function($http) {

this.downloadFile = function(file,urlDir) {

return $http.get('api/downloadFile', {
params : {
file : file,
urlDir : urlDir
}
}); }} ]);


And my service method is this:



@GetMapping("/downloadFile")
@Timed
public ResponseEntity<byte> downloadFile(@RequestParam(value = "file") String file, @RequestParam(value = "urlDir") String urlDir) {
log.debug("GET ---------------- DOWNLOAD FILE : {}", file);
log.debug("GET ---------------- From the DIRECTORY: {}",urlDir);

InputStream fileStream;
String filepath = urlDir+File.separator+file;
try {
File f = new File(filepath);
log.debug("GET ---------------- FILE: {}",f.getPath());
fileStream = new FileInputStream(f);
byte contents = IOUtils.toByteArray(fileStream);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.parseMediaType("application/octet-stream"));
String filename = file;
headers.setContentDispositionFormData(filename, filename);
ResponseEntity<byte> response2 = new ResponseEntity<byte>(contents, headers, HttpStatus.OK);
fileStream.close();
return response2;

} catch (FileNotFoundException e) {
System.err.println(e);
} catch (IOException e) {
System.err.println(e);
}
return null;
}


could you plz take a look and tell me what did I have missed??



Thank youuu :)










share|improve this question





























    2















    download any file using ResponseEntity with angular does not work



    I need to download a file using angular in client side,
    this file can have any format it could be a pdf or excel or image or txt ...
    my method works just for txt files and gives me a fail format for excel and image and for the pdf it gives an empty pdf.



    so in my controller here is the function that calles the service method:



        vm.downloadFile = downloadFile;

    function downloadFile(file){
    var urlDir = "C://STCI//"+idpeticion;
    return VerDocServices.downloadFile(file,urlDir)
    .then(function(response) {
    var data = response.data;
    var filename = file;
    var contentType = 'application/octet-stream';//octet-stream
    var linkElement = document.createElement('a');
    try {
    var blob = new Blob([ data ], {
    type : contentType
    });
    var url = window.URL.createObjectURL(blob);
    linkElement.setAttribute('href', url);
    linkElement.setAttribute("download", filename);
    var clickEvent = new MouseEvent("click", {
    "view" : window,
    "bubbles" : true,
    "cancelable" : false
    });
    linkElement.dispatchEvent(clickEvent);
    } catch (ex) {
    console.log(ex);
    throw ex;
    }
    }).catch(function(response) {
    alert('Se ha producido un error al exportar del documento');
    console.log(response.status);
    throw response;
    });
    }


    and my service.js has:



    angular.module('mecenzApp').service('VerDocServices',['$http',function($http) {

    this.downloadFile = function(file,urlDir) {

    return $http.get('api/downloadFile', {
    params : {
    file : file,
    urlDir : urlDir
    }
    }); }} ]);


    And my service method is this:



    @GetMapping("/downloadFile")
    @Timed
    public ResponseEntity<byte> downloadFile(@RequestParam(value = "file") String file, @RequestParam(value = "urlDir") String urlDir) {
    log.debug("GET ---------------- DOWNLOAD FILE : {}", file);
    log.debug("GET ---------------- From the DIRECTORY: {}",urlDir);

    InputStream fileStream;
    String filepath = urlDir+File.separator+file;
    try {
    File f = new File(filepath);
    log.debug("GET ---------------- FILE: {}",f.getPath());
    fileStream = new FileInputStream(f);
    byte contents = IOUtils.toByteArray(fileStream);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.parseMediaType("application/octet-stream"));
    String filename = file;
    headers.setContentDispositionFormData(filename, filename);
    ResponseEntity<byte> response2 = new ResponseEntity<byte>(contents, headers, HttpStatus.OK);
    fileStream.close();
    return response2;

    } catch (FileNotFoundException e) {
    System.err.println(e);
    } catch (IOException e) {
    System.err.println(e);
    }
    return null;
    }


    could you plz take a look and tell me what did I have missed??



    Thank youuu :)










    share|improve this question



























      2












      2








      2


      1






      download any file using ResponseEntity with angular does not work



      I need to download a file using angular in client side,
      this file can have any format it could be a pdf or excel or image or txt ...
      my method works just for txt files and gives me a fail format for excel and image and for the pdf it gives an empty pdf.



      so in my controller here is the function that calles the service method:



          vm.downloadFile = downloadFile;

      function downloadFile(file){
      var urlDir = "C://STCI//"+idpeticion;
      return VerDocServices.downloadFile(file,urlDir)
      .then(function(response) {
      var data = response.data;
      var filename = file;
      var contentType = 'application/octet-stream';//octet-stream
      var linkElement = document.createElement('a');
      try {
      var blob = new Blob([ data ], {
      type : contentType
      });
      var url = window.URL.createObjectURL(blob);
      linkElement.setAttribute('href', url);
      linkElement.setAttribute("download", filename);
      var clickEvent = new MouseEvent("click", {
      "view" : window,
      "bubbles" : true,
      "cancelable" : false
      });
      linkElement.dispatchEvent(clickEvent);
      } catch (ex) {
      console.log(ex);
      throw ex;
      }
      }).catch(function(response) {
      alert('Se ha producido un error al exportar del documento');
      console.log(response.status);
      throw response;
      });
      }


      and my service.js has:



      angular.module('mecenzApp').service('VerDocServices',['$http',function($http) {

      this.downloadFile = function(file,urlDir) {

      return $http.get('api/downloadFile', {
      params : {
      file : file,
      urlDir : urlDir
      }
      }); }} ]);


      And my service method is this:



      @GetMapping("/downloadFile")
      @Timed
      public ResponseEntity<byte> downloadFile(@RequestParam(value = "file") String file, @RequestParam(value = "urlDir") String urlDir) {
      log.debug("GET ---------------- DOWNLOAD FILE : {}", file);
      log.debug("GET ---------------- From the DIRECTORY: {}",urlDir);

      InputStream fileStream;
      String filepath = urlDir+File.separator+file;
      try {
      File f = new File(filepath);
      log.debug("GET ---------------- FILE: {}",f.getPath());
      fileStream = new FileInputStream(f);
      byte contents = IOUtils.toByteArray(fileStream);
      HttpHeaders headers = new HttpHeaders();
      headers.setContentType(MediaType.parseMediaType("application/octet-stream"));
      String filename = file;
      headers.setContentDispositionFormData(filename, filename);
      ResponseEntity<byte> response2 = new ResponseEntity<byte>(contents, headers, HttpStatus.OK);
      fileStream.close();
      return response2;

      } catch (FileNotFoundException e) {
      System.err.println(e);
      } catch (IOException e) {
      System.err.println(e);
      }
      return null;
      }


      could you plz take a look and tell me what did I have missed??



      Thank youuu :)










      share|improve this question
















      download any file using ResponseEntity with angular does not work



      I need to download a file using angular in client side,
      this file can have any format it could be a pdf or excel or image or txt ...
      my method works just for txt files and gives me a fail format for excel and image and for the pdf it gives an empty pdf.



      so in my controller here is the function that calles the service method:



          vm.downloadFile = downloadFile;

      function downloadFile(file){
      var urlDir = "C://STCI//"+idpeticion;
      return VerDocServices.downloadFile(file,urlDir)
      .then(function(response) {
      var data = response.data;
      var filename = file;
      var contentType = 'application/octet-stream';//octet-stream
      var linkElement = document.createElement('a');
      try {
      var blob = new Blob([ data ], {
      type : contentType
      });
      var url = window.URL.createObjectURL(blob);
      linkElement.setAttribute('href', url);
      linkElement.setAttribute("download", filename);
      var clickEvent = new MouseEvent("click", {
      "view" : window,
      "bubbles" : true,
      "cancelable" : false
      });
      linkElement.dispatchEvent(clickEvent);
      } catch (ex) {
      console.log(ex);
      throw ex;
      }
      }).catch(function(response) {
      alert('Se ha producido un error al exportar del documento');
      console.log(response.status);
      throw response;
      });
      }


      and my service.js has:



      angular.module('mecenzApp').service('VerDocServices',['$http',function($http) {

      this.downloadFile = function(file,urlDir) {

      return $http.get('api/downloadFile', {
      params : {
      file : file,
      urlDir : urlDir
      }
      }); }} ]);


      And my service method is this:



      @GetMapping("/downloadFile")
      @Timed
      public ResponseEntity<byte> downloadFile(@RequestParam(value = "file") String file, @RequestParam(value = "urlDir") String urlDir) {
      log.debug("GET ---------------- DOWNLOAD FILE : {}", file);
      log.debug("GET ---------------- From the DIRECTORY: {}",urlDir);

      InputStream fileStream;
      String filepath = urlDir+File.separator+file;
      try {
      File f = new File(filepath);
      log.debug("GET ---------------- FILE: {}",f.getPath());
      fileStream = new FileInputStream(f);
      byte contents = IOUtils.toByteArray(fileStream);
      HttpHeaders headers = new HttpHeaders();
      headers.setContentType(MediaType.parseMediaType("application/octet-stream"));
      String filename = file;
      headers.setContentDispositionFormData(filename, filename);
      ResponseEntity<byte> response2 = new ResponseEntity<byte>(contents, headers, HttpStatus.OK);
      fileStream.close();
      return response2;

      } catch (FileNotFoundException e) {
      System.err.println(e);
      } catch (IOException e) {
      System.err.println(e);
      }
      return null;
      }


      could you plz take a look and tell me what did I have missed??



      Thank youuu :)







      angularjs download angularjs-http






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Aug 28 '17 at 15:02









      georgeawg

      34.5k115370




      34.5k115370










      asked Jan 16 '17 at 9:01









      SmahaneSmahane

      50110




      50110
























          2 Answers
          2






          active

          oldest

          votes


















          5














          How to Download Binary Files with AngularJS



          When downloading binary files, it is important to set the responseType:



          app.service('VerDocServices',['$http',function($http) {

          this.downloadFile = function(url, file, urlDir) {
          var config = {
          //SET responseType
          responseType: 'blob',
          params : {
          file : file,
          urlDir : urlDir
          }
          };

          return $http.get(url, config)
          .then(function(response) {
          return response.data;
          }).catch(function(response) {
          console.log("ERROR: ", response.status);
          throw response;
          });
          };
          }]);


          If the responseType is omitted the XHR API defaults to converting UTF-8 encoded text to DOMString (UTF-16) which will corrupt PDF, image, and other binary files.



          For more information, see MDN Web API Reference - XHR ResponseType






          share|improve this answer


























          • you are just AMAZINNNG ! thank youuuuuuuuuuuuuuuuu :D

            – Smahane
            Jan 16 '17 at 17:56



















          1














          I don't know much about the backend, but I'll provide what i have used may be it will help, so On the Java Script File:



          //your $http(request...)

          .success(function (data, status, headers, config) {
          //Recieves base64 String data
          var fileName = 'My Awesome File Name'+'.'+'pdf';

          //Parsing base64 String...
          var binaryString = window.atob(data);
          var binaryLen = binaryString.length;
          var fileContent = new Uint8Array(binaryLen);
          for (var i = 0; i < binaryLen; i++) {
          var ascii = binaryString.charCodeAt(i);
          fileContent[i] = ascii;
          }
          var blob = new Blob([fileContent], { type: 'application/octet-stream' }); //octet-stream
          var fileURL = window.URL.createObjectURL(blob);
          $sce.trustAsResourceUrl(fileURL); //allow angular to trust this url
          //Creating the anchor download link
          var anchor = angular.element('<a/>');
          anchor.css({display: 'none'}); // Make sure it's not visible
          angular.element(document.body).append(anchor); // Attach it to the document
          anchor.attr({
          href: fileURL,
          target: '_blank',
          download: fileName
          })[0].click();
          anchor.remove(); // Clean it up afterwards
          })
          //.error(function(...


          And On your backend, make sure that your webservice produces octet-stream and returning the file in base64 data format, i did this using Java JAX-RS like this:



          @POST
          @Path("/downloadfile")
          @Consumes(MediaType.APPLICATION_JSON)
          @Produces(MediaType.APPLICATION_OCTET_STREAM)
          public Response downloadFile(...){
          String base64String = Base64.getEncoder().encodeToString(/*here you pass your file in byte format*/);
          return Response.ok(base64String).build();
          }





          share|improve this answer


























            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f41672656%2fbinary-files-corrupted-how-to-download-binary-files-with-angularjs%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            5














            How to Download Binary Files with AngularJS



            When downloading binary files, it is important to set the responseType:



            app.service('VerDocServices',['$http',function($http) {

            this.downloadFile = function(url, file, urlDir) {
            var config = {
            //SET responseType
            responseType: 'blob',
            params : {
            file : file,
            urlDir : urlDir
            }
            };

            return $http.get(url, config)
            .then(function(response) {
            return response.data;
            }).catch(function(response) {
            console.log("ERROR: ", response.status);
            throw response;
            });
            };
            }]);


            If the responseType is omitted the XHR API defaults to converting UTF-8 encoded text to DOMString (UTF-16) which will corrupt PDF, image, and other binary files.



            For more information, see MDN Web API Reference - XHR ResponseType






            share|improve this answer


























            • you are just AMAZINNNG ! thank youuuuuuuuuuuuuuuuu :D

              – Smahane
              Jan 16 '17 at 17:56
















            5














            How to Download Binary Files with AngularJS



            When downloading binary files, it is important to set the responseType:



            app.service('VerDocServices',['$http',function($http) {

            this.downloadFile = function(url, file, urlDir) {
            var config = {
            //SET responseType
            responseType: 'blob',
            params : {
            file : file,
            urlDir : urlDir
            }
            };

            return $http.get(url, config)
            .then(function(response) {
            return response.data;
            }).catch(function(response) {
            console.log("ERROR: ", response.status);
            throw response;
            });
            };
            }]);


            If the responseType is omitted the XHR API defaults to converting UTF-8 encoded text to DOMString (UTF-16) which will corrupt PDF, image, and other binary files.



            For more information, see MDN Web API Reference - XHR ResponseType






            share|improve this answer


























            • you are just AMAZINNNG ! thank youuuuuuuuuuuuuuuuu :D

              – Smahane
              Jan 16 '17 at 17:56














            5












            5








            5







            How to Download Binary Files with AngularJS



            When downloading binary files, it is important to set the responseType:



            app.service('VerDocServices',['$http',function($http) {

            this.downloadFile = function(url, file, urlDir) {
            var config = {
            //SET responseType
            responseType: 'blob',
            params : {
            file : file,
            urlDir : urlDir
            }
            };

            return $http.get(url, config)
            .then(function(response) {
            return response.data;
            }).catch(function(response) {
            console.log("ERROR: ", response.status);
            throw response;
            });
            };
            }]);


            If the responseType is omitted the XHR API defaults to converting UTF-8 encoded text to DOMString (UTF-16) which will corrupt PDF, image, and other binary files.



            For more information, see MDN Web API Reference - XHR ResponseType






            share|improve this answer















            How to Download Binary Files with AngularJS



            When downloading binary files, it is important to set the responseType:



            app.service('VerDocServices',['$http',function($http) {

            this.downloadFile = function(url, file, urlDir) {
            var config = {
            //SET responseType
            responseType: 'blob',
            params : {
            file : file,
            urlDir : urlDir
            }
            };

            return $http.get(url, config)
            .then(function(response) {
            return response.data;
            }).catch(function(response) {
            console.log("ERROR: ", response.status);
            throw response;
            });
            };
            }]);


            If the responseType is omitted the XHR API defaults to converting UTF-8 encoded text to DOMString (UTF-16) which will corrupt PDF, image, and other binary files.



            For more information, see MDN Web API Reference - XHR ResponseType







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Aug 28 '17 at 14:45

























            answered Jan 16 '17 at 17:12









            georgeawggeorgeawg

            34.5k115370




            34.5k115370













            • you are just AMAZINNNG ! thank youuuuuuuuuuuuuuuuu :D

              – Smahane
              Jan 16 '17 at 17:56



















            • you are just AMAZINNNG ! thank youuuuuuuuuuuuuuuuu :D

              – Smahane
              Jan 16 '17 at 17:56

















            you are just AMAZINNNG ! thank youuuuuuuuuuuuuuuuu :D

            – Smahane
            Jan 16 '17 at 17:56





            you are just AMAZINNNG ! thank youuuuuuuuuuuuuuuuu :D

            – Smahane
            Jan 16 '17 at 17:56













            1














            I don't know much about the backend, but I'll provide what i have used may be it will help, so On the Java Script File:



            //your $http(request...)

            .success(function (data, status, headers, config) {
            //Recieves base64 String data
            var fileName = 'My Awesome File Name'+'.'+'pdf';

            //Parsing base64 String...
            var binaryString = window.atob(data);
            var binaryLen = binaryString.length;
            var fileContent = new Uint8Array(binaryLen);
            for (var i = 0; i < binaryLen; i++) {
            var ascii = binaryString.charCodeAt(i);
            fileContent[i] = ascii;
            }
            var blob = new Blob([fileContent], { type: 'application/octet-stream' }); //octet-stream
            var fileURL = window.URL.createObjectURL(blob);
            $sce.trustAsResourceUrl(fileURL); //allow angular to trust this url
            //Creating the anchor download link
            var anchor = angular.element('<a/>');
            anchor.css({display: 'none'}); // Make sure it's not visible
            angular.element(document.body).append(anchor); // Attach it to the document
            anchor.attr({
            href: fileURL,
            target: '_blank',
            download: fileName
            })[0].click();
            anchor.remove(); // Clean it up afterwards
            })
            //.error(function(...


            And On your backend, make sure that your webservice produces octet-stream and returning the file in base64 data format, i did this using Java JAX-RS like this:



            @POST
            @Path("/downloadfile")
            @Consumes(MediaType.APPLICATION_JSON)
            @Produces(MediaType.APPLICATION_OCTET_STREAM)
            public Response downloadFile(...){
            String base64String = Base64.getEncoder().encodeToString(/*here you pass your file in byte format*/);
            return Response.ok(base64String).build();
            }





            share|improve this answer






























              1














              I don't know much about the backend, but I'll provide what i have used may be it will help, so On the Java Script File:



              //your $http(request...)

              .success(function (data, status, headers, config) {
              //Recieves base64 String data
              var fileName = 'My Awesome File Name'+'.'+'pdf';

              //Parsing base64 String...
              var binaryString = window.atob(data);
              var binaryLen = binaryString.length;
              var fileContent = new Uint8Array(binaryLen);
              for (var i = 0; i < binaryLen; i++) {
              var ascii = binaryString.charCodeAt(i);
              fileContent[i] = ascii;
              }
              var blob = new Blob([fileContent], { type: 'application/octet-stream' }); //octet-stream
              var fileURL = window.URL.createObjectURL(blob);
              $sce.trustAsResourceUrl(fileURL); //allow angular to trust this url
              //Creating the anchor download link
              var anchor = angular.element('<a/>');
              anchor.css({display: 'none'}); // Make sure it's not visible
              angular.element(document.body).append(anchor); // Attach it to the document
              anchor.attr({
              href: fileURL,
              target: '_blank',
              download: fileName
              })[0].click();
              anchor.remove(); // Clean it up afterwards
              })
              //.error(function(...


              And On your backend, make sure that your webservice produces octet-stream and returning the file in base64 data format, i did this using Java JAX-RS like this:



              @POST
              @Path("/downloadfile")
              @Consumes(MediaType.APPLICATION_JSON)
              @Produces(MediaType.APPLICATION_OCTET_STREAM)
              public Response downloadFile(...){
              String base64String = Base64.getEncoder().encodeToString(/*here you pass your file in byte format*/);
              return Response.ok(base64String).build();
              }





              share|improve this answer




























                1












                1








                1







                I don't know much about the backend, but I'll provide what i have used may be it will help, so On the Java Script File:



                //your $http(request...)

                .success(function (data, status, headers, config) {
                //Recieves base64 String data
                var fileName = 'My Awesome File Name'+'.'+'pdf';

                //Parsing base64 String...
                var binaryString = window.atob(data);
                var binaryLen = binaryString.length;
                var fileContent = new Uint8Array(binaryLen);
                for (var i = 0; i < binaryLen; i++) {
                var ascii = binaryString.charCodeAt(i);
                fileContent[i] = ascii;
                }
                var blob = new Blob([fileContent], { type: 'application/octet-stream' }); //octet-stream
                var fileURL = window.URL.createObjectURL(blob);
                $sce.trustAsResourceUrl(fileURL); //allow angular to trust this url
                //Creating the anchor download link
                var anchor = angular.element('<a/>');
                anchor.css({display: 'none'}); // Make sure it's not visible
                angular.element(document.body).append(anchor); // Attach it to the document
                anchor.attr({
                href: fileURL,
                target: '_blank',
                download: fileName
                })[0].click();
                anchor.remove(); // Clean it up afterwards
                })
                //.error(function(...


                And On your backend, make sure that your webservice produces octet-stream and returning the file in base64 data format, i did this using Java JAX-RS like this:



                @POST
                @Path("/downloadfile")
                @Consumes(MediaType.APPLICATION_JSON)
                @Produces(MediaType.APPLICATION_OCTET_STREAM)
                public Response downloadFile(...){
                String base64String = Base64.getEncoder().encodeToString(/*here you pass your file in byte format*/);
                return Response.ok(base64String).build();
                }





                share|improve this answer















                I don't know much about the backend, but I'll provide what i have used may be it will help, so On the Java Script File:



                //your $http(request...)

                .success(function (data, status, headers, config) {
                //Recieves base64 String data
                var fileName = 'My Awesome File Name'+'.'+'pdf';

                //Parsing base64 String...
                var binaryString = window.atob(data);
                var binaryLen = binaryString.length;
                var fileContent = new Uint8Array(binaryLen);
                for (var i = 0; i < binaryLen; i++) {
                var ascii = binaryString.charCodeAt(i);
                fileContent[i] = ascii;
                }
                var blob = new Blob([fileContent], { type: 'application/octet-stream' }); //octet-stream
                var fileURL = window.URL.createObjectURL(blob);
                $sce.trustAsResourceUrl(fileURL); //allow angular to trust this url
                //Creating the anchor download link
                var anchor = angular.element('<a/>');
                anchor.css({display: 'none'}); // Make sure it's not visible
                angular.element(document.body).append(anchor); // Attach it to the document
                anchor.attr({
                href: fileURL,
                target: '_blank',
                download: fileName
                })[0].click();
                anchor.remove(); // Clean it up afterwards
                })
                //.error(function(...


                And On your backend, make sure that your webservice produces octet-stream and returning the file in base64 data format, i did this using Java JAX-RS like this:



                @POST
                @Path("/downloadfile")
                @Consumes(MediaType.APPLICATION_JSON)
                @Produces(MediaType.APPLICATION_OCTET_STREAM)
                public Response downloadFile(...){
                String base64String = Base64.getEncoder().encodeToString(/*here you pass your file in byte format*/);
                return Response.ok(base64String).build();
                }






                share|improve this answer














                share|improve this answer



                share|improve this answer








                edited Jan 16 '17 at 9:52

























                answered Jan 16 '17 at 9:46









                Mostafa OmarMostafa Omar

                11114




                11114






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f41672656%2fbinary-files-corrupted-how-to-download-binary-files-with-angularjs%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    Monofisismo

                    Angular Downloading a file using contenturl with Basic Authentication

                    Olmecas