(6) javaweb 文件下载 ie chrome正常 但是ff下载中文名称乱码 另附上传下载代码

来源:互联网 发布:如何解除冻结淘宝封号 编辑:程序博客网 时间:2024/05/16 05:21

 ------------------------------------------------------------------------------------------------------------------------------------------------


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; // 单文件上传,只取第一个itemfor (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); }      }


ref:   http://www.cnblogs.com/xdp-gacl/p/4200090.html
  

前段页面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 Settingsfile_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 Settingsflash_url : "<%=contextPath%>/js/swfupload/swfupload.swf",custom_settings : {upload_target : "divFileProgressContainer"},// Debug Settingsdebug: 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 fpsif (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;};}};





0 0