当前位置: 首页 > 知识库问答 >
问题:

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

阎庆
2023-03-14

我有一个基于Spring(Spring Security,Spring控制器和MVC)的项目,所以在我的超文本标记语言页面中,我必须允许文件下载。

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

我处理事件并使用基于jquery插件的代码

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! 

在我的控制器中:

@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性方面有问题,比如这个post 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是本文建议的类

共有1个答案

漆雕欣德
2023-03-14

对我有用的示例代码。你可以试试这个样品

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

}

}

 类似资料:
  • 问题内容: 我使用以下代码从ftp下载文件到内存: 如何使它直接将文件发送给用户(浏览器)而不保存到磁盘,也无需重定向到ftp服务器? 问题答案: 只需删除输出缓冲(和其他)。 仅使用此: 虽然如果要添加标题,则必须先使用来查询文件大小: (添加错误处理)

  • 问题内容: 我的代码从远程URL获取文件并在浏览器中下载文件: 代码:http://play.golang.org/p/x-EyR2zFjv 可以获取文件,但是如何在浏览器中下载文件? 问题答案: 要使浏览器打开下载对话框,请在响应中添加和标头: 在将内容发送到客户端之前,请执行此操作。您可能还希望将响应的标头复制到客户端,以显示适当的进度。 要将响应主体流传输到客户端而不将其完全加载到内存中(对

  • 问题内容: 是否可以使用ajax将文件从浏览器升级到FTP服务器? 问题答案: 不会。浏览器不提供允许从JavaScript写入FTP的API。 您可以将文件发布到HTTP端点,然后使用服务器端代码将其推送到FTP服务器。

  • 我正在开发一个基于云的后端HTTP服务,该服务将公开用于与一些on-prem系统的集成。客户机系统是由外部供应商定制的,它们是带有自己数据库的后端系统。这些系统部署在我们客户的公司中,我们无法访问它们,也无法控制它们。我们向供应商提供我们的API规范,他们实现客户机代码。 我的服务与客户交换的数据格式基于XML,并遵循一定的标准。供应商用不同的编程语言实现他们的客户机系统,随着时间的推移,新的供应

  • 我想尝试在cloud9上进行实际操作。但是,我无法访问PC浏览器上的服务器。 详细: 我已经使用默认设置运行了AWS Cloud9环境。接下来运行这些命令。 然后它说。 我相信这是很正常的反应方式。 问题是,如何使用我的PC浏览器访问此正在运行的服务器?如果我在Mac电脑上开发,只需访问就很容易了http://localhost:8080这就是全部。如何在cloud9环境中实现这一点? 我试过:-

  • 问题内容: 我有一个URL,用于保存我的工作中的一些项目,它们大部分是MDB文件,但也有一些JPG和PDF。 我需要做的是列出该目录中的每个文件(已完成)并为用户提供下载它的选项。 使用PHP如何实现? 问题答案: 要读取目录内容,可以使用readdir()并使用脚本(在我的示例中)来下载文件 在其中,您可以强制浏览器发送下载数据,并使用basename()来确保客户端不会传递其他文件名,例如