0

I am trying to download an base64 encoded file on controller. Here is the code I have followed from few google stores.

 byte[] dataBytes = "QkVHSU46VkNBTEVOREFSDQpWRVJTSU9OOjIuMA0KTUVUSE9EOlBVQkxJU0gNClBST0RJRDotLy9DaXRyaXggT25saW5lLy9Hb1RvV2ViaW5hci8vRU4NClgtTVMtT0xLLUZPUkNFSU5TUEVDVE9ST1BFTjpUUlVFDQpCRUdJTjpWVElNRVpPTkUNClRaSUQ6QW1lcmljYS9Mb3NfQW5nZWxlcw0KVFpVUkw6aHR0cDovL3R6dXJsLm9yZy96b25laW5mby1vdXRsb29rL0FtZXJpY2EvTG9zX0FuZ2VsZXMNClgtTElDLUxPQ0FUSU9OOkFtZXJpY2EvTG9zX0FuZ2VsZXMNCkJFR0lOOkRBWUxJR0hUDQpUWk9GRlNFVEZST006LTA4MDANClRaT0ZGU0VUVE86LTA3MDANClRaTkFNRTpQRFQNCkRUU1RBUlQ6MTk3MDAzMDhUMDIwMDAwDQpSUlVMRTpGUkVRPVlFQVJMWTtCWU1PTlRIPTM7QllEQVk9MlNVDQpFTkQ6REFZTElHSFQNCkJFR0lOOlNUQU5EQVJEDQpUWk9GRlNFVEZST006LTA3MDANClRaT0ZGU0VUVE86LTA4MDANClRaTkFNRTpQU1QNCkRUU1RBUlQ6MTk3MDExMDFUMDIwMDAwDQpSUlVMRTpGUkVRPVlFQVJMWTtCWU1PTlRIPTExO0JZREFZPTFTVQ0KRU5EOlNUQU5EQVJEDQpFTkQ6VlRJTUVaT05FDQpCRUdJTjpWRVZFTlQNCkRUU1RBTVA6MjAxNzA0MjBUMjExMDM0Wg0KRFRTVEFSVDtUWklEPUFtZXJpY2EvTG9zX0FuZ2VsZXM6MjAxNzA0MjVUMTAwMDAwDQpEVEVORDtUWklEPUFtZXJpY2EvTG9zX0FuZ2VsZXM6MjAxNzA0MjVUMTEwMDAwDQpTVU1NQVJZOkdvVG9XZWJpbmFyIC0gTW9kZWxpbmcgYW5kIFF1ZXJ5aW5nIERhdGEgYW5kIFJlbGF0aW9uc2hpcHMgaW4gU2FsDQogZXNmb3JjZSAoQXByaWwgMjVcLCAyMDE3KQ0KTE9DQVRJT046R29Ub1dlYmluYXIgLSBTZWUgY29uZmVyZW5jZSBjYWxsIGluZm9ybWF0aW9uIGJlbG93DQpVSUQ6MzU0MzQ0NjUzQGNpdHJpeG9ubGluZS5jb20NCk9SR0FOSVpFUjpkZXZlbG9wZXJAc2FsZXNmb3JjZS5jb20NCkRFU0NSSVBUSU9OOjEuIENsaWNrIGFuZCBqb2luIGF0IHRoZSBzcGVjaWZpZWQgdGltZSBhbmQgZGF0ZTpcbmh0dHBzOi8vZ2wNCiBvYmFsLmdvdG93ZWJpbmFyLmNvbS9qb2luLzMwMDQ4NTAyMTE2NjI1MTkyOTgvMzQzNTgxNTY1XG5Ob3RlOiBUaGlzIGxpbmsNCiAgc2hvdWxkIG5vdCBiZSBzaGFyZWQgd2l0aCBvdGhlcnNcOyBpdCBpcyB1bmlxdWUgdG8geW91LlxuXG5cblRoZSBTYWxlc2YNCiBvcmNlIG9iamVjdCBtb2RlbCBhbmQgdGhlIFNPUUwgcXVlcnkgbGFuZ3VhZ2UgZm9ybSB0aGUgZm91bmRhdGlvbiBvZiB3b3INCiBraW5nIHdpdGggU2FsZXNmb3JjZSBkYXRhLiBXaGlsZSBtb3N0IGRldmVsb3BlcnMgYXJlIFNRTC1saXRlcmF0ZVwsIHRoZXINCiBlIGFyZSBzbWFsbCBidXQgaW1wb3J0YW50IGRpc3RpbmN0aW9ucyBiZXR3ZWVuIFNPUUwgYW5kIFNRTC4gSW4gdGhpcyB3ZWINCiBpbmFyXCwgZGV2ZWxvcGVycyBuZXcgdG8gU2FsZXNmb3JjZSB3aWxsIGNvbWUgdG8gdW5kZXJzdGFuZCB0aGVzZSBkaWZmZXINCiBlbmNlc1wsIGp1bXBzdGFydGluZyB0aGVpciBTYWxlc2ZvcmNlIGRldmVsb3BlciBzdWNjZXNzLlxuDQpYLUFMVC1ERVNDO0ZNVFRZUEU9dGV4dC9odG1sOjxIVE1MPjxIRUFEPjxUSVRMRT48L1RJVExFPjxCT0RZPjxGT05UIFNJWkU9DQogMj48Yj4xLiBDbGljayBhbmQgam9pbiBhdCB0aGUgc3BlY2lmaWVkIHRpbWUgYW5kIGRhdGU6PC9iPjwvRk9OVD48QlI+PEZPDQogTlQgU0laRT0yPmh0dHBzOi8vZ2xvYmFsLmdvdG93ZWJpbmFyLmNvbS9qb2luLzMwMDQ4NTAyMTE2NjI1MTkyOTgvMzQzNTgxDQogNTY1PC9GT05UPjxCUj48Rk9OVCBTSVpFPTI+Tm90ZTogVGhpcyBsaW5rIHNob3VsZCBub3QgYmUgc2hhcmVkIHdpdGggb3RoDQogZXJzXDsgaXQgaXMgdW5pcXVlIHRvIHlvdS48L0ZPTlQ+PEJSPjxCUj48Rk9OVCBTSVpFPTI+XG5UaGUgU2FsZXNmb3JjZSBvDQogYmplY3QgbW9kZWwgYW5kIHRoZSBTT1FMIHF1ZXJ5IGxhbmd1YWdlIGZvcm0gdGhlIGZvdW5kYXRpb24gb2Ygd29ya2luZyB3DQogaXRoIFNhbGVzZm9yY2UgZGF0YS4gV2hpbGUgbW9zdCBkZXZlbG9wZXJzIGFyZSBTUUwtbGl0ZXJhdGVcLCB0aGVyZSBhcmUgDQogc21hbGwgYnV0IGltcG9ydGFudCBkaXN0aW5jdGlvbnMgYmV0d2VlbiBTT1FMIGFuZCBTUUwuIEluIHRoaXMgd2ViaW5hclwsDQogIGRldmVsb3BlcnMgbmV3IHRvIFNhbGVzZm9yY2Ugd2lsbCBjb21lIHRvIHVuZGVyc3RhbmQgdGhlc2UgZGlmZmVyZW5jZXNcDQogLCBqdW1wc3RhcnRpbmcgdGhlaXIgU2FsZXNmb3JjZSBkZXZlbG9wZXIgc3VjY2Vzcy48L0ZPTlQ+PEJSPjwvQk9EWT48L0hUDQogTUw+DQpCRUdJTjpWQUxBUk0NClRSSUdHRVI6LVBUMTVNDQpBQ1RJT046RElTUExBWQ0KREVTQ1JJUFRJT046UmVtaW5kZXINCkVORDpWQUxBUk0NCkVORDpWRVZFTlQNCkVORDpWQ0FMRU5EQVINCg==".getBytes();
                Utilities.downloadFile(response, "application/pdf",
                        "Filename.pdf", dataBytes);

    response.setContentType("application/octet-stream");
    response.setHeader("Content-Disposition", "attachment; filename=" + fileName +"."+ fileType);
    response.setHeader("Pragma", "no-cache");
    response.setHeader("Cache-Control", "no-cache");

    InputStream is = new ByteArrayInputStream(decodedDocument.getBytes(StandardCharsets.UTF_8));

    FileCopyUtils.copy(is, response.getOutputStream());
    response.flushBuffer();

This is working fine and returning success on ajax but not showing download popup or not downloading as file on browser. Any help is appreciated.

Adding Js function.

 /**
 * DownloadFile
 * When clicked on download file, execute this.
 */
downloadFile: function(patientId, attachmentId ) {
    window.location.href = '/patient/details/attachments/download/' + patientId + '/' + attachmentId;
}

Thanks

Gowthami Reddy
  • 430
  • 7
  • 23
  • The problem is likely in the way you invoke this "download". Show that code. Standard things like `$.post` in jQuery cannot download files to the user's computer. You can refer to this answer for more info: https://stackoverflow.com/a/9970672/2788 – Strelok Aug 02 '17 at 06:20
  • Editted question with the js function. – Gowthami Reddy Aug 02 '17 at 06:28
  • meybe you may use this jquey plugin https://jqueryfiledownload.apphb.com/ – Angelo Immediata Aug 02 '17 at 06:51
  • @GowthamiReddy so no, that won't work. Standard jQuery `$.ajax` call won't initiate a download, you need to use a solution. Why not just generate a normal link, especially if it's a GET request. – Strelok Aug 02 '17 at 06:57
  • I have updated the question. Can you please help?? – Gowthami Reddy Aug 03 '17 at 13:37

2 Answers2

0

You can not initiate download by ajax request! Here you can find detail answer.

But the provided plugin is too much browser dependent

As you expect to download via browser, so you need to make simple GET request by URL like <a href="'/patient/details/attachments/download/{patientId}/{attachmentId}">Download</a>

Zico
  • 2,349
  • 2
  • 22
  • 25
0

The file started downloading with out getting corrupted after sending the bytes of encodedDocument instead of String.

/* Set the file properties*/
if(fileType == null) {
    response.setContentType("application/octet-stream");
} else {
    response.setContentType(fileType);
}
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");

/* Convert bytes to stream of objects*/
InputStream is = new ByteArrayInputStream(decodedDocument);

/*Download copying the content to destination file*/
IOUtils.copy(is, response.getOutputStream());
response.flushBuffer();
Gowthami Reddy
  • 430
  • 7
  • 23