------------------------------------------------------------------------------------------------------------------------------------------------
javaweb项目 文件下载 ie chrome正常 但是ff下载中文名称乱码 百度了下解决方案 测试可行。IE火狐和chrome测了三个
//浏览器下载乱码 ie chrome ff ---------start
String ua = request.getHeader("User-Agent");
if(ua != null){
if(( ua.toLowerCase().indexOf("firefox") > 0) || ua.toLowerCase().indexOf("mozilla") > 0 ){
//解决火狐浏览器下载文件名乱码问题 (20150619 new)
String userAgent = request.getHeader("User-Agent");
byte[] bytes = userAgent.contains("MSIE") ? realname.getBytes() : realname.getBytes("UTF-8"); // name.getBytes("UTF-8")处理safari的乱码问题
realname = new String(bytes, "ISO-8859-1"); // 各浏览器基本都支持ISO编码
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", realname)); // 文件名外的双引号处理firefox的空格截断问题
}else{
//设置响应头,控制浏览器下载该文件 ,仅此火狐下会出现下载文件中文乱码的问题 ,ie chrome正常
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8").replace("+", "%20"));
}
}else{
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8").replace("+", "%20"));
}
//浏览器下载乱码 ie chrome ff ---------end
------------------------------------------------------------------------------------------------------------------------------------------------
附文件上传下载代码:
/**
* 文件上传
*/
@RequestMapping(value = "/uploadFileExe.do", method = RequestMethod.POST)
public void uploadFileExe(HttpServletRequest request, HttpServletResponse response) {
String message = ""; // 消息提示
try {
// 得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全
V_USER vUser = (V_USER) request.getSession().getAttribute("user");
String folderName = "companyId" + vUser.getCompanyId();
String tempDirectory = PropertiesUtil.getStringValue("userLoan_file_upload_path");
String savePath = tempDirectory +File.separator+folderName;
// 判断上传文件的保存目录是否存在
File file = new File(savePath);
if (!file.exists() && !file.isDirectory()) {
file.mkdirs();// 创建目录
}
// 1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
// 解决上传文件名的中文乱码
upload.setHeaderEncoding("UTF-8");
// 3、判断提交上来的数据是否是上传表单的数据
if (!ServletFileUpload.isMultipartContent(request)) {
response.setStatus(566);//566状态码 传递给前端 SWF组件 含义"系统异常,上传失败!"
return;
}
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,每一个FileItem对应一个Form表单的输入项
List<FileItem> list = upload.parseRequest(request);
FileItem item = null; // 单文件上传,只取第一个item
for (int i = 0 ;i < list.size(); i++){
item = (FileItem) list.get(i);
// 保存文件
if (!item.isFormField() && item.getName()!=null&&!item.getName().endsWith(".tmp")) {
item = list.get(i);
break;
}
}
Long size = item.getSize();
String sizeStr = "";
if(size<1024){
sizeStr = size+"字节";
}else if(size>=1024 && size<1048576){
sizeStr = new DecimalFormat("#.00").format((double)size/1024) +"K";
}else{
sizeStr = new DecimalFormat("#.00").format((double)size/1048576) +"M";
}
String filename = item.getName(); // 得到上传的文件名称,
// 注意:不同的浏览器提交的文件名是不一样的,有些浏览器提交上来的文件名是带有路径的,如: c:\a\b\1.txt,而有些只是单纯的文件名,如:1.txt
// 处理获取到的上传文件的文件名的路径部分,只保留文件名部分
filename = filename.substring(filename.lastIndexOf("\\") + 1);
if(filename.length()>30){
response.setStatus(555);//555状态码 传递给前端 SWF组件 含义"文件名超长,上传失败!30个字符内!"
return;
}
//文件重名校验:重名则不允许上传<业务代码>
List<UserLoanUpFilePojo> list4Name = userLoadService.queryFileListByCompanyid( vUser.getCompanyId());
boolean dupNameflag = false;
if( list4Name!=null && !list4Name.isEmpty()){
for (UserLoanUpFilePojo userLoanUpFilePojo : list4Name) {
if(userLoanUpFilePojo.getFileName().equals(filename)){
dupNameflag = true;break;
}
}
if(dupNameflag){
response.setStatus(599);//777状态码 传递给前端 SWF组件 含义"同名文件已存在,上传失败!"
return;
}
}
// 获取item中的上传文件的输入流
InputStream in = item.getInputStream();
// 创建一个文件输出流
File f = new File(savePath + File.separator + filename);
if (!f.exists()) {
f.createNewFile();
}
FileOutputStream out = new FileOutputStream(f);
// 创建一个缓冲区
byte buffer[] = new byte[1024];
// 判断输入流中的数据是否已经读完的标识
int len = 0;
// 循环将输入流读入到缓冲区当中,(len=in.read(buffer))>0就表示in里面还有数据
while ((len = in.read(buffer)) > 0) {
// 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录中
out.write(buffer, 0, len);
}
// 更新数据库记录
UserLoanUpFilePojo userLoanUpFilePojo = new UserLoanUpFilePojo();
userLoanUpFilePojo.setCompanyId(vUser.getCompanyId());
userLoanUpFilePojo.setCompanyName(vUser.getCompany_name());
userLoanUpFilePojo.setFileName(filename);
userLoanUpFilePojo.setFileFlagUnique(String.valueOf(System .currentTimeMillis()));
userLoanUpFilePojo.setFileSize(size);
userLoanUpFilePojo.setFileSizeMk(sizeStr);
userLoanUpFilePojo.setCreateDate(TimeUtils.getNowDate("yyyy-MM-dd HH:mm:ss"));
userLoanUpFilePojo.setCreateUserId(vUser.getId());
try {
userLoadService.insertUserLoadUpfile(userLoanUpFilePojo);
} catch (Exception e) {
e.printStackTrace();
response.setStatus(588);//588状态码 传递给前端 SWF组件 含义"保存文件数据失败,请重新上传!"
return;
}
// 关闭输入流
in.close();
// 关闭输出流
out.close();
// 删除处理文件上传时生成的临时文件
item.delete();
message = filename + "上传成功!";
} catch (Exception e) {
logger.error("",e);
e.printStackTrace();
response.setStatus(566);//566状态码 传递给前端 SWF组件 含义"系统异常,上传失败!"
return;
}
response.setStatus(200);
}
/**
* 文件下载操作
*/
@RequestMapping(value = "/downuserLoanFile.do", method = RequestMethod.GET)
public void downuserLoanFile(HttpServletRequest request, HttpServletResponse response) {
try {
String fid = (String) request.getParameter("fid");
UserLoanUpFilePojo userLoanUpFilePojo = userLoadService.queryFnByUniqueId(fid);
String folderName = "companyId"+userLoanUpFilePojo.getCompanyId();
String tempDirectory = PropertiesUtil.getStringValue("userLoan_file_upload_path");
String savePath = tempDirectory+File.separator+folderName;
String fileName = userLoanUpFilePojo.getFileName();
//上传的文件都是保存在/WEB-INF/upload目录下的子目录当中
File file = new File(savePath+File.separator+fileName);
//如果文件不存在
if(!file.exists()){
return;
}
//处理文件名
String realname = fileName.substring(fileName.indexOf("_")+1);
System.out.println(URLEncoder.encode(realname, "UTF-8"));
//浏览器下载乱码 ie chrome ff ---------start
String ua = request.getHeader("User-Agent");
if(ua != null){
if(( ua.toLowerCase().indexOf("firefox") > 0) || ua.toLowerCase().indexOf("mozilla") > 0 ){
//解决火狐浏览器下载文件名乱码问题 (20150619 new)
String userAgent = request.getHeader("User-Agent");
byte[] bytes = userAgent.contains("MSIE") ? realname.getBytes() : realname.getBytes("UTF-8"); // name.getBytes("UTF-8")处理safari的乱码问题
realname = new String(bytes, "ISO-8859-1"); // 各浏览器基本都支持ISO编码
response.setHeader("Content-disposition", String.format("attachment; filename=\"%s\"", realname)); // 文件名外的双引号处理firefox的空格截断问题
}else{
//设置响应头,控制浏览器下载该文件 ,仅此火狐下会出现下载文件中文乱码的问题 ,ie chrome正常
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8").replace("+", "%20"));
}
}else{
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(realname, "UTF-8").replace("+", "%20"));
}
//浏览器下载乱码 ie chrome ff ---------end
//读取要下载的文件,保存到文件输入流
FileInputStream in = new FileInputStream(file);
//创建输出流
OutputStream out = response.getOutputStream();
//创建缓冲区
byte buffer[] = new byte[1024];
int len = 0;
//循环将输入流中的内容读取到缓冲区当中
while((len=in.read(buffer))>0){
//输出缓冲区的内容到浏览器,实现文件下载
out.write(buffer, 0, len);
}
out.flush();
//关闭文件输入流
in.close();
//关闭输出流
out.close();
} catch (Exception e) {
logger.error("",e);
}
}
前段页面SWFupload提交请求( 前端的人帮忙弄了一下改了header.js)
<form>
<table border="0" cellspacing="0" cellpadding="3" style="margin-top: 100px">
<tbody><tr>
<td class="title">请选择上传文件</td>
</tr>
<tr>
<td>
<div class="position_r clearfix" id="flashBtn">
<input type="text" class="inp fl" id="fileValue" style="color:#475477;" readonly="readonly">
<div class="fl">
<div class="flashBtn_trigger">
<span id="spanButtonPlaceholder"></span>
</div>
</div>
</div></td>
</tr>
<tr>
<td class="alert">*目前支持的文件类型是.xls,.xlsx,.txt,.zip,.rar</td>
</tr>
<tr>
<td class="">
<span id="notifyInfo" ></span>
</td>
</tr>
</tbody></table>
</form>
<script type="text/javascript" src="<%=contextPath%>/js/swfupload/swfupload.js"></script>
<script type="text/javascript" src="<%=contextPath%>/js/swfupload/handlers.js"></script>
<script type="text/javascript">
var swfu;
window.onload = function () {
swfu = new SWFUpload({
upload_url: "<%=contextPath%>/userLoanController/uploadFileExe.do;jsessionid=<%=request.getSession().getId()%>",
post_params: {},
button_image_url : "<%=contextPath%>/img/up_1.png",
use_query_string:true,
// File Upload Settings
file_size_limit : "20 MB", // 文件大小控制
file_types : "*.txt;*.zip;*.xls;*.xlsx;*.zip;*.rar",
file_types_description : "All Files",
file_upload_limit : 0, //配置上传个数
file_queue_limit : 1,
file_queue_error_handler : fileQueueError,
file_dialog_complete_handler : fileDialogComplete,//选择好文件后提交
file_queued_handler : fileQueued,
upload_progress_handler : uploadProgress,
upload_error_handler : uploadError,
upload_success_handler : uploadSuccess,
upload_complete_handler : uploadComplete,
button_placeholder_id : "spanButtonPlaceholder",
button_width: 96,
button_height: 28,
button_text : '',
button_text_style : '.button { font-family: Helvetica, Arial, sans-serif; font-size: 12pt; } .buttonSmall { font-size: 10pt; }',
button_text_top_padding: 0,
button_text_left_padding: 18,
button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
button_cursor: SWFUpload.CURSOR.HAND,
// Flash Settings
flash_url : "<%=contextPath%>/js/swfupload/swfupload.swf",
custom_settings : {
upload_target : "divFileProgressContainer"
},
// Debug Settings
debug: false //是否显示调试窗口
});
};
function startUploadFile(){
swfu.startUpload();
}
/* $('#flashBtn').delegate('input','click',function(evt){
$('#flashBtn object').trigger('click')
}) */
</script>
function fileQueueError(file, errorCode, message) {
try {
var imageName = "<font color='red'>文件上传错误</font>";
var errorName = "";
if (errorCode === SWFUpload.errorCode_QUEUE_LIMIT_EXCEEDED) {
errorName = "You have attempted to queue too many files.";
}
if (errorName !== "") {
//alert(errorName+"??");
return;
}
switch (errorCode) {
case SWFUpload.QUEUE_ERROR.ZERO_BYTE_FILE:
imageName = "<font color='#475477'>文件大小为0,上传失败!</font>";
break;
case SWFUpload.QUEUE_ERROR.FILE_EXCEEDS_SIZE_LIMIT:
imageName = "<font color='#475477'>文件大小超过限制,上传失败!文件大小20M以内!</font>";
break;
case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
imageName = "<font color='#475477'>文件格式不匹配,上传失败!</font>";
break;
case SWFUpload.QUEUE_ERROR.INVALID_FILETYPE:
default:
//alert(message);
break;
}
addReadyFileInfo(file.id,file.name,imageName,"无法上传");
} catch (ex) {
this.debug(ex);
}
}
/**
* 当文件选择对话框关闭消失时,如果选择的文件成功加入上传队列,
* 那么针对每个成功加入的文件都会触发一次该事件(N个文件成功加入队列,就触发N次此事件)。
* @param {} file
* id : string, // SWFUpload控制的文件的id,通过指定该id可启动此文件的上传、退出上传等
* index : number, // 文件在选定文件队列(包括出错、退出、排队的文件)中的索引,getFile可使用此索引
* name : string, // 文件名,不包括文件的路径。
* size : number, // 文件字节数
* type : string, // 客户端操作系统设置的文件类型
* creationdate : Date, // 文件的创建时间
* modificationdate : Date, // 文件的最后修改时间
* filestatus : number // 文件的当前状态,对应的状态代码可查看SWFUpload.FILE_STATUS }
*/
function fileQueued(file){
//console.log('fileQueued()');
//addReadyFileInfo(file.id,file.name,"成功加载到上传队列");
}
function fileDialogComplete(numFilesSelected, numFilesQueued) {
//console.log('fileDialogComplete()');
try {
if (numFilesQueued > 0) {
//document.getElementById('btnCancel').disabled = "";
this.startUpload();
}
} catch (ex) {
this.debug(ex);
}
}
function uploadProgress(file, bytesLoaded) {
try {
var percent = Math.ceil((bytesLoaded / file.size) * 100);
var progress = new FileProgress(file, this.customSettings.upload_target);
progress.setProgress(percent);
if (percent === 100) {
progress.setStatus("");//正在创建缩略图...
progress.toggleCancel(false, this);
} else {
progress.setStatus("正在上传...");
progress.toggleCancel(true, this);
}
} catch (ex) {
this.debug(ex);
}
}
//单文件上传成功更改提示信息
function uploadSuccess(file, serverData) {
document.getElementById("fileValue").value = file.name;
var infoTable = document.getElementById("notifyInfo");
var infoTable = document.getElementById("notifyInfo");
infoTable.innerHTML = "上传成功!";
}
function addFileInfo(fileId,message){
var infoTable = document.getElementById("notifyInfo");
infoTable.innerHTML = message;
}
function addReadyFileInfo(fileid,fileName,message,status){
//定制 -- 将生成的错误信息显示到指定的区域
var infoTable = document.getElementById("notifyInfo");
infoTable.innerHTML = message;
/*//用表格显示
var infoTable = document.getElementById("infoTable");
var row = infoTable.insertRow();
row.id = fileid;
var col1 = row.insertCell();
var col2 = row.insertCell();
var col3 = row.insertCell();
var col4 = row.insertCell();
col4.align = "right";
col1.innerHTML = message+" : ";
col2.innerHTML = fileName;
if(status!=null&&status!=""){
col3.innerHTML="<font color='red'>"+status+"</font>";
}else{
col3.innerHTML="";
}
col4.innerHTML = "<a href='javascript:deleteFile(\""+fileid+"\")'>删除</a>";
col1.style.width="150";
col2.style.width="250";
col3.style.width="80";
col4.style.width="50";*/
}
function cancelUpload(){
var infoTable = document.getElementById("infoTable");
var rows = infoTable.rows;
var ids = new Array();
var row;
if(rows==null){
return false;
}
for(var i=0;i<rows.length;i++){
ids[i] = rows[i].id;
}
for(var i=0;i<ids.length;i++){
deleteFile(ids[i]);
}
}
function deleteFile(fileId){
//用表格显示
var infoTable = document.getElementById("infoTable");
var row = document.getElementById(fileId);
infoTable.deleteRow(row.rowIndex);
swfu.cancelUpload(fileId,false);
}
function uploadComplete(file) {
//console.log('uploadComplete()')
try {
/* I want the next upload to continue automatically so I'll call startUpload here */
if (this.getStats().files_queued > 0) {
this.startUpload();
} else {
var progress = new FileProgress(file, this.customSettings.upload_target);
progress.setComplete();
progress.setStatus("<font color='red'>所有文件上传完毕!</b></font>");
progress.toggleCancel(false);
}
} catch (ex) {
this.debug(ex);
}
}
function uploadError(file, errorCode, message) {
var imageName = "<font color='red'>文件上传出错!</font>";
var progress;
try {
switch (errorCode) {
case SWFUpload.UPLOAD_ERROR.FILE_CANCELLED:
try {
progress = new FileProgress(file, this.customSettings.upload_target);
progress.setCancelled();
progress.setStatus("<font color='red'>取消上传!</font>");
progress.toggleCancel(false);
}
catch (ex1) {
this.debug(ex1);
}
break;
case SWFUpload.UPLOAD_ERROR.UPLOAD_STOPPED:
try {
progress = new FileProgress(file, this.customSettings.upload_target);
progress.setCancelled();
progress.setStatus("<font color='red'>停止上传!</font>");
progress.toggleCancel(true);
}
catch (ex2) {
this.debug(ex2);
}
case SWFUpload.UPLOAD_ERROR.UPLOAD_LIMIT_EXCEEDED:
imageName = "<font color='red'>文件大小超过限制!</font>";
break;
default:
//alert(message);
break;
}
if(message=="599"){
var imageName = "<font color='#475477'>同名文件已存在," +file.name+" 上传失败!</font>";
}
if(message=="588"){
var imageName = "<font color='#475477'>保存 "+file.name+"信息失败 ,请重新上传!</font>";
}
if(message=="566"){
var imageName = "<font color='#475477'>系统异常," +file.name+"上传失败,稍后重试!</font>";
}if(message=="555"){
var imageName = "<font color='#475477'>文件名超长,上传失败!30个字符内!</font>";
}
addFileInfo(file.id,imageName);
} catch (ex3) {
this.debug(ex3);
}
}
function addImage(src) {
var newImg = document.createElement("img");
newImg.style.margin = "5px";
document.getElementById("thumbnails").appendChild(newImg);
if (newImg.filters) {
try {
newImg.filters.item("DXImageTransform.Microsoft.Alpha").opacity = 0;
} catch (e) {
// If it is not set initially, the browser will throw an error. This will set it if it is not set yet.
newImg.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + 0 + ')';
}
} else {
newImg.style.opacity = 0;
}
newImg.onload = function () {
fadeIn(newImg, 0);
};
newImg.src = src;
}
function fadeIn(element, opacity) {
var reduceOpacityBy = 5;
var rate = 30; // 15 fps
if (opacity < 100) {
opacity += reduceOpacityBy;
if (opacity > 100) {
opacity = 100;
}
if (element.filters) {
try {
element.filters.item("DXImageTransform.Microsoft.Alpha").opacity = opacity;
} catch (e) {
// If it is not set initially, the browser will throw an error. This will set it if it is not set yet.
element.style.filter = 'progid:DXImageTransform.Microsoft.Alpha(opacity=' + opacity + ')';
}
} else {
element.style.opacity = opacity / 100;
}
}
if (opacity < 100) {
setTimeout(function () {
fadeIn(element, opacity);
}, rate);
}
}
/* ******************************************
* FileProgress Object
* Control object for displaying file info
* ****************************************** */
function FileProgress(file, targetID) {
this.fileProgressID = "divFileProgress";
this.fileProgressWrapper = document.getElementById(this.fileProgressID);
if (!this.fileProgressWrapper) {
this.fileProgressWrapper = document.createElement("div");
this.fileProgressWrapper.className = "progressWrapper";
this.fileProgressWrapper.id = this.fileProgressID;
this.fileProgressElement = document.createElement("div");
this.fileProgressElement.className = "progressContainer";
var progressCancel = document.createElement("a");
progressCancel.className = "progressCancel";
progressCancel.href = "#";
progressCancel.style.visibility = "hidden";
progressCancel.appendChild(document.createTextNode(" "));
var progressText = document.createElement("div");
progressText.className = "progressName";
progressText.appendChild(document.createTextNode("上传文件: "+file.name));
var progressBar = document.createElement("div");
progressBar.className = "progressBarInProgress";
var progressStatus = document.createElement("div");
progressStatus.className = "progressBarStatus";
progressStatus.innerHTML = " ";
this.fileProgressElement.appendChild(progressCancel);
this.fileProgressElement.appendChild(progressText);
this.fileProgressElement.appendChild(progressStatus);
this.fileProgressElement.appendChild(progressBar);
this.fileProgressWrapper.appendChild(this.fileProgressElement);
document.getElementById(targetID).style.height = "75px";
document.getElementById(targetID).appendChild(this.fileProgressWrapper);
fadeIn(this.fileProgressWrapper, 0);
} else {
this.fileProgressElement = this.fileProgressWrapper.firstChild;
this.fileProgressElement.childNodes[1].firstChild.nodeValue = "上传文件: "+file.name;
}
this.height = this.fileProgressWrapper.offsetHeight;
}
FileProgress.prototype.setProgress = function (percentage) {
this.fileProgressElement.className = "progressContainer green";
this.fileProgressElement.childNodes[3].className = "progressBarInProgress";
this.fileProgressElement.childNodes[3].style.width = percentage + "%";
};
FileProgress.prototype.setComplete = function () {
this.fileProgressElement.className = "progressContainer blue";
this.fileProgressElement.childNodes[3].className = "progressBarComplete";
this.fileProgressElement.childNodes[3].style.width = "";
};
FileProgress.prototype.setError = function () {
this.fileProgressElement.className = "progressContainer red";
this.fileProgressElement.childNodes[3].className = "progressBarError";
this.fileProgressElement.childNodes[3].style.width = "";
};
FileProgress.prototype.setCancelled = function () {
this.fileProgressElement.className = "progressContainer";
this.fileProgressElement.childNodes[3].className = "progressBarError";
this.fileProgressElement.childNodes[3].style.width = "";
};
FileProgress.prototype.setStatus = function (status) {
this.fileProgressElement.childNodes[2].innerHTML = status;
};
FileProgress.prototype.toggleCancel = function (show, swfuploadInstance) {
this.fileProgressElement.childNodes[0].style.visibility = show ? "visible" : "hidden";
if (swfuploadInstance) {
var fileID = this.fileProgressID;
this.fileProgressElement.childNodes[0].onclick = function () {
swfuploadInstance.cancelUpload(fileID);
return false;
};
}
};