我有一个基于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是本文建议的类
对我有用的示例代码。你可以试试这个样品
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()来确保客户端不会传递其他文件名,例如