------------------------------------------------------------------------------------------------------------------------------------------------
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;
};
}
};