Download Files from Server Javascript Download Files from Server Javascript
Total Page:16
File Type:pdf, Size:1020Kb
download files from server javascript Download files from server javascript. JavaTpoint offers too many high quality services. Mail us on [email protected], to get more information about given services. Website Designing Website Development Java Development PHP Development WordPress Graphic Designing Logo Digital Marketing On Page and Off Page SEO PPC Content Development Corporate Training Classroom and Online Training Data Entry. Training For College Campus. JavaTpoint offers college campus training on Core Java, Advance Java, .Net, Android, Hadoop, PHP, Web Technology and Python. Please mail your requirement at [email protected] Duration: 1 week to 2 week. Authenticated File Download in JavaScript. Not long ago, I presented a webinar on CMIS where I demonstrated a standalone Web application that used CMIS to access content from a Nuxeo repository. One particular feature I was excited to show was the ability to download a rendition of a document living in the Nuxeo Content Services Platform. Much to my embarrassment I discovered later that this example did not work at all unless I was already logged in to the Nuxeo application. Kind of defeats the purpose of building a standalone web application! So I set about rectifying this oversight. It turned out to be a difficult problem to research, but with a pretty simple solution. Since the issue is not really Nuxeo-specific, I decided to handle it in a separate blog. This information should benefit anyone needing to download files that require authentication from JavaScript code. Note: I will be blogging about my CMIS client in a future post as well. User Story. I want to be able to download the PDF rendition of a Nuxeo document via CMIS using a single-page Web application. To be clear the Web application is not a Nuxeo application, just a basic app running on Apache, for example. The request involves a simple URL like this: The Problem. Authentication. Of course the request must be authenticated. In general, I want to avoid use of the browser’s ugly authentication dialog, so this means the authentication needs to occur in the code. Thus a simple <a> tag will not suffice. If the user clicks a link, this navigates away from the single-page application, thus any authentication information is lost and the user gets the browser’s authentication dialog. The same problem applies to techniques that involve window.open , using a <form> , using an <iframe> , etc. Save the File Locally. In addition, I want the user experience to be just like any other file download. Maybe it goes to the “Downloads” folder, or even opens in the browser, depending on the file type and browser support. The Solution. The solution is made of two main parts: An XMLHTTPRequest (XHR) call to retrieve the file (as a blob); the call is authenticated. A JavaScript library that takes the blob returned by XHR and saves it on the local system as a file. The Explanation. To get the blob you just need to authenticate via XHR. The built-in params ( username and password ) for XHR don’t seem to work (in fact they may not be intended to be used in this way). However, manually adding the Authorization header DOES work. For example: xhr.setRequestHeader("Authorization", "Basic " + Base64.encode(userName + ":" + password)); To save the blob I used FileSaver.js . As far as I can decipher, here is what it does: Save the blob to temporary storage using the JavaScript File API. Create an <a> element and assign a blob URL to it that references the above file. Enable the HTML5 download attribute` for this element. Note: This is how it works for Chrome and Firefox, but it depends on the browser. For example Safari does not yet support download . FileSaver.js is robust enough to support several browsers. “Click” the element via JavaScript. Note that FileSaver.js implements the HTML5 W3C saveAs() interface. At some point it's likely the browsers will implement saveAs()` natively. The Context. The solution is deceptively simple. It took me several days of research, understanding, and testing to find the answer. While scouring the internet I found there are several ways to “download a file” using JavaScript and several ways to make authenticated requests using JavaScript, but I found literally nothing that combines the two on the client side. Every solution I found that attempted to combine the two involved modifications on the server side. Caveat: the solution, in particular the file download, relies on the File API from HTML5, as well as the download attribute. The point is it works well mainly in modern browsers. The Tips. You need to configure CORS in Nuxeo to allow CMIS requests from a Web app. I chose to restrict it to just the JSON binding from localhost . Here is my contribution: download.js appears to be an older (but viable) solution. The reason I mention it is because it appears to skip the step of saving the file to local storage. It takes the blob returned by XHR and creates an anchor tag that points to it directly in memory (still using the blob URL syntax). But the behavior in Safari is far inferior to FileSaver.js . You can’t access the filename using XHR once you’re using CORS. There’s a great explanation here. The summary is that you are limited to “simple response headers” when using XHR with CORS. Nuxeo returns the filename in the content-disposition header; this one is not accessible. It’s no big deal when using CMIS because you can just get the document name via the CMIS object. Incidentally XHRs withCredentials does nothing and appears to have nothing to do with the username/password passed to XHR. It’s used for passing cookies with CORS requests. CORS normally restricts/does not pass cookies across domains. The Example. I tried to make the example as simple as possible to focus on a) authenticating the request and b) saving the file. By no means is it meant to be a “best practice” example, just a simple explanation of how it works. How to download XLSX file from a server response in javascript? I have a react frontend and java server using the Micronaut framework. In the BaseController of my Micronaut Framework, I am creating an XLSX file and then sending the response so that it gets downloaded when called from the frontend code. BaseController. ExportService. Note : Using the main method of this class I am able to create a TestReport.xlsx file. XLSXExporter class uses Apache POI library to generate XLSX file. I tested the above API from Postman and it is able to download an XLSX file. When I call the above export API using my application (javascript), it is able to download an xlsx file but it does not open. Javascript code to call export API. Once I click yes on the above dialog I get below error and nothing gets displayed as opposed to the file downloaded from Postman. What is the best way to download file from server. I have interesting task which requires me to download a dynamically generated file from a server (ASP.NET) to the client. On the client side it is just JavaScript (jQuery) and the client is able to generate a lot of parameters to customize how the data is exported. What is the best way to do download the file from the server? Should I use a WCF service such as what is described here or simple page like this one? I don't know how to download a file without reloading the page (I'm not sure that $.ajax will work in this case). Could someone please give me some direction on this topic? Thanks. 1 Answer 1. First you can create the file from a handler .ashx. Let say that you have the file for downloading at download.ashx and you have some parametres to pass from your javascript, eg download.ashx? p1=8827&p2=8831 to know what you going to create. Then on your javascript you simple can make a redirect as. or alternative you can use the window.open for do the same think. and your file will start the download. Just make sure that you have set the header of attachment, and the correct contenttype on your handle eg: Download files from server javascript. On my most recent assignment I was faced with the challenge of downloading a pdf file from an API and displaying it in the browser. Normally, the API would provide a json-object with a link to the pdf, which can then be used to open a new browser tab/window and the browser or platform takes care of the rest. In this case however the API was designed for native mobile apps and required the presence of a custom ‘api-key’ http-header, which made it impossible to just provide the url to the browser. To solve this it was necessary to download the file to memory with an XHR request and then get the browser to open or download it with whatever plugin/UI it normally uses for pdf file. For the XHR request we use the Fetch API with the whatwg-fetch polyfill. In essence the Fetch API fetch() method returns a response, from which a blob can be created. This blob object can be use to create an objectURL, which can then be used as href in a link. This solution works on Chrome, Safari, Firefox, Opera, IE11 and Edge. This Post Has 62 Comments. Thank you soooo much! You saved my day. In case of IE I use window.navigator.msSaveOrOpenBlob(newBlob, filename) however would you know how to set the title of a new window or file name in “other” browsers? I believe that is what “link.download” does.