JAVA文件下载功能问题解决日志
今天给报告系统做了个下载功能,遇到了挺多问题,通过查资料一一解决了。
1、首先遇到的问题是:java后台的输出流输出之后,没有任何报错,浏览器端不弹出保存文件的对话框,原本是ajax请求到后台的controller方法中添加了下载的方法,type和async两个参数的四种组合都不行,弃用ajax,用window.location.href='file/download?path='+file;重新发一个新的下载请求之后,保存对话框终于弹出。
2、弹出之后,发现文件名乱码,后台的解决方案代码如下:
private static final String CHARSET = "utf-8";
String agent = request.getHeader("User-Agent").toLowerCase();
if (agent != null && (agent.indexOf("msie") != -1 ||
(agent.indexOf("rv") != -1 && agent.indexOf("firefox") == -1))) {
fileName = URLEncoder.encode(file.getName(), "UTF-8");
} else {
fileName = new String(file.getName().getBytes(CHARSET), "ISO8859-1");
}
3、后台一直在报错getWriter() has already been called for this response,通过报错内容大概可以看出ServletOutputStream out = response.getOutputStream();这个应该是个单例的,但是又没有发现别的地方在调用这个方法获取输出流,仔细测试发现,每次把所有的请求全部关闭之后,第一次不会出问题,之后再请求就会报错,把后面的out.close();注释掉,报错就解决了。
4、前台拼文件路径的方法
var file;
var path = $("#lujing").val();
if(path.lastIndexOf('\\')!=path.length-1){
//console.info("不以斜杠结尾");
file = $("#lujing").val() + "\\" + $("#city").val() + "市" + $("#year1").val()
+ $("#month1").val() + "电商数据分析报告.doc";
} else {
//console.info("以斜杠结尾");
file = $("#lujing").val() + $("#city").val() + "市" + $("#year1").val()
+ $("#month1").val() + "电商数据分析报告.doc";
} window.location.href='file/download?path='+file;
5、导出controller
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author 作者 Jeffy
* @version
*
*/
@Controller
public class FileController{
//Spring这里是通过实现ServletContextAware接口来注入ServletContext对象 private static final String CHARSET = "utf-8";
@RequestMapping("/exportreport/file/download")
public static void fileDownload(HttpServletResponse response, HttpServletRequest request,
String path) throws UnsupportedEncodingException{ File file = new File(path);
String fileName;
String agent = request.getHeader("User-Agent").toLowerCase();
if (agent != null && (agent.indexOf("msie") != -1 ||
(agent.indexOf("rv") != -1 && agent.indexOf("firefox") == -1))) {
fileName = URLEncoder.encode(file.getName(), "UTF-8");
} else {
fileName = new String(file.getName().getBytes(CHARSET), "ISO8859-1");
} // response.reset(); //非常重要
//1.设置文件ContentType类型,这样设置,会自动判断下载文件类型
response.setContentType("multipart/form-data");
response.setContentType("application/OCTET-STREAM;charset=UTF-8");
//2.设置文件头:最后一个参数是设置下载文件名(假如我们叫a.pdf)
response.setHeader("Content-Disposition", "attachment;fileName="+fileName);
ServletOutputStream out; try {
FileInputStream inputStream = new FileInputStream(file); //3.通过response获取ServletOutputStream对象(out)
out = response.getOutputStream(); int b = 0;
byte[] buffer = new byte[512];
while ((b = inputStream.read(buffer)) != -1){
//4.写到输出流(out)中
out.write(buffer,0,b);
}
inputStream.close();
// out.close();
// out.flush(); } catch (IOException e) {
e.printStackTrace();
}
} }
以上便是遇到的java文件下载功能全部问题,可能还有暂时没有测试出的问题,后续发现问题及时更新,也请大家多多批评指正。
JAVA文件下载功能问题解决日志的更多相关文章
- Java 文件下载功能 解决中文乱码
Html部分 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <ti ...
- JAVA 文件下载乱码问题解决办法
页面设置隐藏的iframe <iframe id='reqFrame' frameborder='0' style='display:none' allowtransparency='true' ...
- Atitit php java python nodejs错误日志功能的比较
Atitit php java python nodejs错误日志功能的比较 1.1. Php方案 自带 1 1.2. Java解决方案 SLF4J 1 1.3. Python解决方案 自带lo ...
- java web文件下载功能实现 (转)
http://blog.csdn.net/longshengguoji/article/details/39433307 需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一 ...
- 【Servlet】java web 文件下载功能实现
需求:实现一个具有文件下载功能的网页,主要下载压缩包和图片 两种实现方法: 一:通过超链接实现下载 在HTML网页中,通过超链接链接到要下载的文件的地址 <!DOCTYPE html> & ...
- 【java】java自带的java.util.logging.Logger日志功能
偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logg ...
- Java 文件句柄泄露问题解决小记(转)
转:Java 文件句柄泄露问题解决小记 维护 WebIDE 免不了要管理很多的文件, 自从我们线上系统增加了资源回收功能,便一直受一个问题困扰:后台线程解绑目录时偶尔报错,看症状因为是某些文件被占用了 ...
- 解决springmvc中文件下载功能中使用javax.servlet.ServletOutputStream out = response.getOutputStream();后运行出异常但结果正确的问题
问题描述: 在springmvc中实现文件下载功能一般都会使用javax.servlet.ServletOutputStream out = response.getOutputStream();封装 ...
- Android 虚拟机Dalvik、Android各种java包功能、Android相关文件类型、应用程序结构分析、ADB
Android虚拟机Dalvik Dalvik冲击 随着Google 的AndroidSDK 的发布,关于它的API 以及在移动电话领域所带来的预期影响这些方面的讨论不胜枚举.不过,其中的一个话题在J ...
随机推荐
- java基础之 超类Object
一.概述: Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法.在不明确给出超类的情况下,Java会自动把Object作为要 ...
- 开发板远程操作SQL SERVER解决方案
环境: 开发板:freescale 2.6 armv71,系统只读,唯一可以读写的路径是/tmp/sd(这是一个sd卡).程序放在/tmp/sd/transfer下(下文以运行路径代替),sql语句以 ...
- IOS 设置导航栏
//设置导航栏的标题 self.navigationItem setTitle:@"我的标题"; //设置导航条标题属性:字体大小/字体颜色…… /*设置头的属性:setTitle ...
- C 计算数组长度
int data[4],length; length=sizeof(data)/sizeof(data[0]); //数组占内存总空间除以单个元素占内存空间大小,即等于元素个数 printf(&qu ...
- xml配置文件的读写
using System.Xml; //----------------------------------------------读出XML文件中的节点值 XmlDocument xmlDoc = ...
- 龙哥库塔法or欧拉法求解微分方程matlab实现
举例:分别用欧拉法和龙哥库塔法求解下面的微分方程 我们知道的欧拉法(Euler)"思想是用先前的差商近似代替倒数",直白一些的编程说法即:f(i+1)=f(i)+h*f(x,y)其 ...
- portotype
[ portotype ] [语法] function :function Name是创建新的函数的名称 body : body可以选项,包含调用该函数时被执行的JScrtipt 代码的字符串. ...
- ping 出现负值
遇到一个问题,使用ping 命令的时候会出现负值.网上查询得知 AMD双核CPU,要打上CPU厂家提供的驱动补丁和微软的双核补.
- iOS—Mask属性的使用
Mask属性介绍 Mask平时用的最多的是masksToBounds 吧. 其实除此以外Mask使用场景很多,看完之后你会发现好真是好用的不要不要的... 先来了解下Mask属性到底是什么? Mask ...
- 如何全面解决ECSHOP的jquery冲突
主要就是Ecshop的AJAX传输类,transport.js中重写了object的对象原型,从而导致了与jq框架的冲突. 解决: 1. 删除transport.js中587行 - 636行中关于ob ...