Some browsers will further clean up file names. My version of chrome seems to replace : and " with underscores. I'm sure there are others but that's out of scope. This also works in IE and Chrome, almost the same answer only for other browsers the answer is a bit shorter.
Stack Overflow for Teams — Collaborate and share knowledge with a private group. Create a free Team What is Teams? Collectives on Stack Overflow. Learn more. Angular 6 Downloading file from rest api Ask Question. Asked 3 years, 2 months ago.
Active 2 months ago. Viewed k times. Add a comment. Active Oldest Votes. J Scott 1 1 silver badge 6 6 bronze badges. Finally, we click the link like the user would've done with a regular browser download link.
After the file is downloaded, we'll discard the blob by revoking the object URL we created. This approach is pretty verbose though and might not work smoothly for every browser. Therefore I'd advise you to use the popular library FileSaver. The saving then becomes a one-liner:. If you don't like adding a dependency for this and would prefer to use the manual approach shown before, you might as well refactor the code for saving the blob into a separate service. You can also create a custom injection token for URL - also see below how we'll do this for FileSaver.
By setting the option observe to events while making an HTTP request, we won't just receive the final response body of the request but also get access to intermediate HTTP events. We also need to explicitly pass the option reportProgress in order to receive HttpProgressEvents. Our HTTP request will eventually look like follows:. Since we don't just want to forward these events to every component, our service has to do some more work. Otherwise our component would have to deal with HTTP specifics - that's what services are for!
Instead let's introduce a data structure representing a download with progress:. A Download can be in one of three states. Either it hasn't started yet, therefore it's pending. Otherwise it's done or still in progress. We use TypeScript's union types to define the different download states.
Additionally, a download has a number indicating the download progress from 1 to Once a download is done, it will contain a Blob as its content - until then this property is not available, therefore null.
Now we want to abstract from specific HTTP events to our newly defined data structure. FileService ;. Autowired ;. Resource ;. HttpStatus ;. GetMapping ;.
PathVariable ;. ResponseStatus ;. RestController ;. HttpServletResponse ;. ResponseStatus HttpStatus. ClassPathResource ;. FileSystemResource ;. Component ;. Angular Use pipe in services and components in Angular 2 Mar, Angular How to set headers for every request in Angular 1 Mar, You may also specify any value from supporting values, such as, json, blob, arraybuffer, text.
You can have a look for more details on response type. I have used three ways for downloading file — two ways for Save as functionality and one way to show the file content on browser itself. The above line create a Blob object with file content in response and expecting the file of JSON type. The above two lines create a URL that will open the file in browser in new window.
The above line shows the file content on browser, so it does not give you save as option. The above line uses ready-made FileSaver module that will open the file with Save as option.
I have created service class to fetch file data from a server URL but I need to provide a link or button for downloading the file. In the view file I will give users two options for downloading the same file. I will use link as well as button for downloading the same file from the server. In the service class I have used Http module which may not be found automatically.
So I need to register it in providers array of NgModule.
0コメント