1. 程式人生 > >javaweb 檔名下載亂碼問題終極解決方案

javaweb 檔名下載亂碼問題終極解決方案

之前看很多部落格都是通過 判斷userAgent來處理檔名的中文亂碼問題,如下

 if (userAgent.indexOf("MSIE")!=-1 || userAgent.indexOf("Trident")!=-1 || userAgent.indexOf("Edge")!=-1 ) {     // ie  
   fileName = new String(fileName.getBytes("GBK"), "iso-8859-1");  
                   } else if (null != userAgent && -1 != userAgent.indexOf("Mozilla"
)) { // 火狐,chrome等 fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1"); }

但博主實際開發中發現,這種也不是百分之百有效,最簡單粗暴的方式就是把fileName 先BASE64編碼存為url,然後下載時候再把fileName用BASE64解碼,就可以規避瀏覽器對中文編碼不一致的問題了,程式碼如下:

package com.nercel.cyberhouse.ws.sns;

import java.io
.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.UUID; import javax.servlet.http.HttpServletRequest
; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import com.alibaba.fastjson.JSON; import com.nercel.cyberhouse.util.ServerConfig; import com.nercel.cyberhouse.vo.UFile; import com.nercel.cyberhouse.vo.UploadFile; import java.util.regex.*; @Controller @RequestMapping("sns") public class FileUpload { private String CYBERHOUSE_PATH = ServerConfig.get("cyberhouse.root"); @RequestMapping(value = "/uploadFile", produces = "text/plain; charset=utf-8") public @ResponseBody String uploadFile(@RequestParam(value = "file", required = false) MultipartFile file,int userId,HttpServletRequest request, HttpServletResponse response) { UploadFile upFile = new UploadFile(); String path = request.getSession().getServletContext().getRealPath("upload/sns/"+userId+"/"); // String fileName = StringFilter(file.getOriginalFilename()); String fileName = file.getOriginalFilename(); String ext=fileName.substring(fileName.lastIndexOf(".")+1); if(file.getSize()>1024*1024*50){ upFile.setCode(1); upFile.setMsg("單個檔案/圖片大小不能超過50M!"); return JSON.toJSONString(upFile); } String name=UUID.randomUUID().toString()+"."+ext; String downLoadPath=path+"/"+name; File targetFile = new File(path,name); if(!targetFile.exists()){ targetFile.mkdirs(); } try { file.transferTo(targetFile); upFile.setCode(0); UFile uf=new UFile(); uf.setName(fileName); byte[] b = null; b = fileName.getBytes("utf-8"); uf.setSrc(CYBERHOUSE_PATH+"/sns/downLoadFile?downLoadPath="+downLoadPath+"&fileName="+new BASE64Encoder().encode(b)); upFile.setData(uf); } catch (Exception e) { e.printStackTrace(); } return JSON.toJSONString(upFile); } @RequestMapping("/downLoadFile") public void downLoadFile(String downLoadPath, String fileName,HttpServletResponse response,HttpServletRequest request) throws UnsupportedEncodingException { BufferedInputStream bis = null; BufferedOutputStream bos = null; byte[] b = null; String resultFileName = null; BASE64Decoder decoder = new BASE64Decoder(); try { b = decoder.decodeBuffer(fileName); } catch (IOException e1) { e1.printStackTrace(); } resultFileName = new String(b, "utf-8"); try { response.setCharacterEncoding("UTF-8"); long fileLength = new File(downLoadPath).length(); String userAgent = request.getHeader("User-Agent"); response.setHeader("Content-disposition", "attachment; filename="+new String(resultFileName.getBytes("gbk"),"iso-8859-1")); response.setContentType("application/x-download;"); response.setHeader("Content-Length", String.valueOf(fileLength)); bis = new BufferedInputStream(new FileInputStream(downLoadPath)); bos = new BufferedOutputStream(response.getOutputStream()); byte[] buff = new byte[2048]; int bytesRead; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } bos.flush(); } catch (Exception e) { } finally { if (bis != null) { try { bis.close(); } catch (IOException e) { e.printStackTrace(); } } if (bos != null) { try { bos.close(); } catch (IOException e) { e.printStackTrace(); } } } } // 過濾特殊字元 public static String StringFilter(String str) throws PatternSyntaxException{ // 清除掉所有特殊字元和空格 String regEx="[`[email protected]#$%^&*()+=|{}':;',\\[\\]<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、? ]"; Pattern p = Pattern.compile(regEx); Matcher m = p.matcher(str); return m.replaceAll("").trim(); } //layui上傳檔案公共服務 @RequestMapping(value = "/upload", produces = "text/plain; charset=utf-8") public @ResponseBody String upload(@RequestParam(value = "file", required = false) MultipartFile file,HttpServletRequest request, HttpServletResponse response) { UploadFile upFile = new UploadFile(); String msg="上傳失敗!"; long fileSize = file.getSize(); System.out.println("fileSize="+fileSize); if(fileSize>2097152){ upFile.setCode(1); upFile.setMsg("上傳檔案不能超過2M!"); return JSON.toJSONString(upFile); } String fileName = StringFilter(file.getOriginalFilename()); String fileType= fileName.substring(fileName.lastIndexOf(".")+1); Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");//可以方便地修改日期格式 String today = dateFormat.format(now); String path = request.getSession().getServletContext().getRealPath("upload/layuiUploads/"+fileType+"/"+today); String name=UUID.randomUUID().toString()+fileName; String downLoadPath=path+"/"+name; File targetFile = new File(path,name); if(!targetFile.exists()){ targetFile.mkdirs(); } try { file.transferTo(targetFile); upFile.setCode(0); UFile uf=new UFile(); uf.setName(fileName); uf.setSrc(CYBERHOUSE_PATH+"/sns/downLoadFile?downLoadPath="+downLoadPath+"&fileName="+fileName); upFile.setData(uf); msg="上傳成功!"; upFile.setMsg(msg); } catch (Exception e) { e.printStackTrace(); } System.out.println(JSON.toJSONString(upFile)); return JSON.toJSONString(upFile); } }

相關推薦

javaweb 檔名下載亂碼問題終極解決方案

之前看很多部落格都是通過 判斷userAgent來處理檔名的中文亂碼問題,如下 if (userAgent.indexOf("MSIE")!=-1 || userAgent.indexOf("Trident")!=-1 || userAgent.indexO

IDEA 文檔註釋 亂碼 終極... 解決方案

RM nbsp odin src exe enc 最後一行 span png idea bin 目錄 下 phpstorm64.exe.vmoptions 最後一行添加 : -Dfile.encoding=UTF-8 IDEA 文檔註釋 亂

linux 下navicat 中文亂碼終極解決方案

navicat 也是夠了,直接用了個wine包裝navicat 成了linux版本的了,對此表示無語 此前有很多人說,要更改startnavicat指令碼中的 lang 很明確的說沒有成功,因為 根本不是那的事, 是因為wine的事  解決辦法: 安裝 文泉驛字型

ubtuntu環境下使用matplotlib 繪圖中文亂碼終極解決方案

很多童鞋都喜歡在linux環境下寫程式碼,但是Linux環境下經常會出現如下圖中文亂碼的問題,博主最近在linux下寫python程式時就遇到了matplotlib繪圖時總出現中文變成框框的情況。其他的童鞋也給出了不錯的辦法比如修改全域性環境的方法等,博主

django中文亂碼終極解決方案

pyhon的預設編碼是ASCII編碼,可以通過sys.getdefaultencoding(),為了避免比較麻煩的編碼問題應設定系統預設編碼為utf8 import sys default_encoding = 'utf-8' if sys.getdefaultenco

SSH框架中文亂碼終極解決方案

在java專案開發中,容易發生亂碼,在幾個地方設定,避免亂碼: 以eclipse開發環境為例: 1.開發環境設定成utf-8:在window–preferences–General–Workspace下設定; 2.tomcat配置檔案設定成utf-8:在你

解決OpenOffice格式轉換中文亂碼終極解決方案

今天遇到個很鬱悶的問題,用openOffice 在windows開發環境下轉換ppt,word到pdf,裡面的文字無論中英文都能正常顯示,但是部署到了生產環境(CentOS 7.3.2)之後,轉換的結果全部是亂碼,於是在網上找了一篇文章,步驟寫得很好,按照他的步驟成功解決了問

utf-8編碼的頁面向GBK編碼的頁面提交中文表單亂碼終極解決方案

有關這個問題已經困擾我好多天了,甚至都有點上火,但是最後還是解決了。。 是這樣的,我是做有關讀秀的的請求,但是請求中文無論怎樣都是亂碼,無論是在請求前用js處理,還是用盡各種辦法,就是死活不行,後來到

關於java檔案下載檔名亂碼問題解決方案

JAVA檔案下載時亂碼有兩種情況: 1,下載時中文檔名亂碼 2,下載時因為路徑中包含中文檔名亂碼,提示找不到檔案 解決方法見下面部分程式碼 response.setContentType("multipart/form-data"); String userAgen

JavaWeb 亂碼問題終極解決方案

rac ssa src 同傳 data strong param cati 一起 經常有讀者在公眾號上問 JavaWeb 亂碼的問題,昨天又有一個小夥伴問及此事,其實這個問題很簡單,但是想要說清楚卻並不容易,因為每個人亂碼的原因都不一樣,給每位小夥伴都把亂碼的原因講一遍也挺

JavaWeb的各種中文亂碼終極解決方法

一、Servlet輸出亂碼 1. 用servlet.getOutStream位元組流輸出中文,假設要輸出的是String str ="釣魚島是中國的,無恥才是日本的"。 1.1 若是本地伺服器與本地客戶端這種就不用說了,直接可以out.write(st

終極解決方案——sbt配置阿里映象源,解決sbt下載慢,dump project structure from sbt耗時問題

#sbt下載慢的問題 預設情況下,sbt使用mvn2倉庫下載依賴,如下載scalatest時,idea的sbtshell 顯示如下url https://repo1.maven.org/maven2/org/scalatest/scalatest_2.10/3.0.1/scalatest_2.1

谷歌瀏覽器chrome下載慢的終極解決方案

Before(;´д`)ゞ 我們之前的解決方案 總是新增 Free download 作為預設下載器下載 ; 或者複製下載連結,使用迅雷新建下載任務進行下載 長時間的這樣使用,會覺得很麻煩 因為我們經常要使用瀏覽器下載something; 由於中國防火牆(GFW)的強大,線上下載Go

表單提交後資料中文亂碼終極解決方案

1、檢視頁面是否使用utf-8編碼 ①jsp頁面: <%@ page language="java" contentType="text/html; charset=UTF-8"

SpringMVC生成Excel和PDF檔案時檔名亂碼解決方案

解決下載的檔名為中文時的亂碼問題: //將程式碼 response.setHeader("Content-Disposition", "attachment; filename=" + URL

關於Idea裏設置Terminal為Git/bin/bash.exe中文亂碼的問題的終極解決方案

.exe 終極 min program user codepage 註冊 窗口 如果 1.這裏如果設置為Git/git-bash.exe確實不會亂碼,但是每次點Idea裏的Terminal都會彈出一個單獨的terminal窗口而非在idea子窗口裏出現; 2.因此需要設置

JSP中文亂碼問題終極解決方案

在介紹方法之前我們首先應該清楚具體的問題有哪些,筆者在本部落格當中論述的JSP中文亂碼問題有如下幾個方面:頁面亂碼、引數亂碼、表單亂碼、原始檔亂碼。下面來逐一解決其中的亂碼問題。 一、JSP頁面中文亂碼 在JSP頁面中,中文顯示亂碼有兩種情況:一種是HTML中的中文亂碼,另

DoNetZip解壓縮中文檔名亂碼解決方案

今天踩進了這個坑裡,寫一下省的後面的人掉坑 using (ZipFile zip = new ZipFile(zip_file, Encoding.UTF8)) { zip.Extract

struts2 檔案下載中文亂碼問題解決方案

問題描述:1.前臺jsp頁面通過?傳遞中文引數,action中接收出現亂碼 2.下載檔案時,中文檔案無法顯示。 解決方案:1.在網上查了資料通過在jsp頁面上urlencode可以解決,但是我改為傳遞英文引數,繞開該問題                      2.

Linux作業系統下終端亂碼終極解決方案 export LANG=zh_CN.UTF-8 export LANG=en_US

在使用linux的終端工具SecureCRT的時候,每次提交SVN想輸入中文日誌的時候總是輸不了中文。 svn ci -m "" 這時候兩個引號之間就是沒有辦法輸入中文。 後來跟其他同學請教,找了一個終極解決方案 要先保證SecureCRT是UTF8格式的,設定:選項-會話選項-終端-外觀的字元編碼,選擇u