我有一个基于 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/