java - 通过 Rest Web 服务从服务器上的浏览器文件存储下载

标签 java jquery ajax spring rest

我有一个基于 Spring 的项目(Spring security、spring control e MVC),所以在我的 HTML 页面中我必须允许文件下载。 当用户点击此:

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

我处理事件并使用基于 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! 

在我的 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());
    }
}

但是 Spring Security 有问题,就像这篇文章 x-frame并且在 Internet Explorer 上不起作用。 那么,有没有一种方法可以在不使用插件的情况下下载存储在我的服务器上的文件? 谢谢

已解决:Hansraj 帮助了我,这是工作代码:

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());
        }

在 HTML 中,我使用了 href 和 Web 服务的 url。 Utils 是此 post 中建议的类

最佳答案

对我有用的示例代码。您可以尝试这个示例

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();
    }

}

}

关于java - 通过 Rest Web 服务从服务器上的浏览器文件存储下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36617035/

相关文章:

jquery - 如何使用 jQuery 向 DropDownList 添加选项?

javascript - 使用 Javascript 运行 php 脚本来检查用户名

javascript - jQuery 对类的一个元素的值进行动画处理

javascript - 选择 ng-options 不使用 ajax 更新 AngularJS 中的 ng-model

php - 频繁轮询会使服务器重载吗?如果是这样,实现实时更新的最佳方式是什么?

java - java中的Apache通用编解码器从字符串到十六进制,反之亦然

java - 如何在lambda表达式(JAVA)中使用try catch?

java - 如何使用子类对象访问隐藏的父类(super class)成员

java - 如果类声明无法更改,如何在序列化时或多或少地全局更改生成的 Json?

php - (穷人的)产品推荐执行