luca
luca

Reputation: 3318

Download from browser files stores on server through Rest web services

I have a project based on Spring (Spring security, spring controller e MVC ) so in my HTML page I have to allow file download. When user click on this :

<a href="#" target="'+row.idCar+'" id="logName" name="logDownload"> <i class="fa fa-file-text-o fa-2x" aria-hidden="true"></i></a>'

I handle event and use this code based on jquery plugin

var input = $(this),
        idCar= $(this).attr('target');
        $.fileDownload("../download/" + idCar , {
            successCallback: function (url) {
            },
            failCallback: function (HttpServletResponse, url) {
                notifyMessage("Error downloading file", 'error');
            }
        });
        return false; //this is critical to stop the click event which will trigger a normal file download! 

In my controller:

@Override
@RequestMapping(value="/download/{idCar}", method = RequestMethod.GET)
public void download(HttpServletResponse response, @PathVariable("idCar") int idCar) {
    try{
        File file = fleetAndCarService.getLogFile(idCar);
        try(InputStream is = new FileInputStream(file.getAbsolutePath())) {
            response.setHeader("Set-Cookie", "fileDownload=true; path=/");
            response.setHeader("Content-Disposition",
                        "attachment; filename=\"" + "AcquisitionLog.txt" + "\"");
            org.apache.commons.io.IOUtils.copy(is,
                        response.getOutputStream());
            response.flushBuffer();
        } catch (Exception e1) {
            ErrorResponse errorResponse= ErrorResponseBuilder.buildErrorResponse(e1);
            LOG.error("Threw exception in FleetAndCarControllerImpl::download :" + errorResponse.getStacktrace());
        }
    }catch(Exception e){
        ErrorResponse errorResponse= ErrorResponseBuilder.buildErrorResponse(e);
        LOG.error("Threw exception in FleetAndCarControllerImpl::download :" + errorResponse.getStacktrace());
    }
}

But it has problem with Spring Security like this post x-frame and on internet explorer doesn't work. So, there is a way to download file stored on my server without use of plugin? Thanks

RESOLVED: Hansraj helped me and this is the working code:

try{
            File file = fleetAndCarService.getLogFile(idCar);
            try(InputStream is = new FileInputStream(file.getAbsolutePath())){
                response.setHeader("Expires", "0");
                response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
                response.setContentType("text/plain");
                response.setHeader("Content-Description"," File Transfer");
                response.setHeader("Content-Disposition","attachment; filename="+"AcquisitionLog.txt");
                response.setHeader("Content-Transfer-Encoding"," binary");
                long size = Utils.stream(is, response.getOutputStream());
                response.addHeader("Content-Length", Long.toString(size));
                response.flushBuffer();
            }catch (Exception e1){
                ErrorResponse errorResponse= ErrorResponseBuilder.buildErrorResponse(e1);
                LOG.error("Threw exception in FleetAndCarControllerImpl::download :" + errorResponse.getStacktrace());
            }
        }catch (Exception e) {
            ErrorResponse errorResponse= ErrorResponseBuilder.buildErrorResponse(e);
            LOG.error("Threw exception in FleetAndCarControllerImpl::download :" + errorResponse.getStacktrace());
        }

in the HTML I used href with the url of web service. Utils is the class suggested in this post

Upvotes: 0

Views: 1749

Answers (1)

Hansraj
Hansraj

Reputation: 174

Sample code that worked for me. You can try this sample

package com.mti.controller.booking;

import java.io.ByteArrayInputStream;
@Controller
@RequestMapping(value = "/offlineBooking")
public class OfflineBookingController {
@RequestMapping(value = "/getInvoice")
public void getInvoice(ModelMap modelMap, @RequestParam(value = "bookingId", required = true) Integer bookingId,
        HttpServletResponse response) throws Exception {
    Document document = new Document();
    InputStream is = null;
    PdfWriter writer = null;
    try{
    String everything = bookingService.getBookingInvoiceData(bookingId);
    is = new ByteArrayInputStream(everything.getBytes("UTF-8"));
    response.setHeader("Expires", "0");
    response.setHeader("Cache-Control","must-revalidate, post-check=0, pre-check=0");
    response.setHeader("Pragma", "public");

    response.setContentType("application/pdf");
    response.setHeader("Content-Description"," File Transfer");
    response.setHeader("Content-Disposition","attachment; filename="+"BookingInvoice"+ bookingId+".pdf");
    response.setHeader("Content-Transfer-Encoding"," binary");
    writer = PdfWriter.getInstance(document, response.getOutputStream());
    document.open();
    XMLWorkerHelper.getInstance().parseXHtml(writer, document, is);
    writer.flush();
    response.flushBuffer();
    }catch (Exception e) {
        logger.error("Error in generating invoice " , e);
    }finally{
        if(writer!=null){
            writer.close();
        }
        document.close();
        is.close();
    }

}

}

Upvotes: 1

Related Questions