文件的上傳(如何兼容火狐與IE)與國際化的原理

1.文件的上傳
    [1] 簡介
        > 將本地的文件上傳到服務器中
        > 用戶須要經過一個表單將文件上傳到服務器中
 
    [2] 表單的設置
        > 上傳文件時須要使用input表單項,input的type時file。
        > 上傳文件的表單必定要是post請求。
        > 在表單中還有一個屬性:
            enctype,使用它來指定如何處理請求體,它的默認值是application/x-www-form-urlencoded。
            他的意思是請求體會被URL編碼,而咱們上傳文件時上傳的是文件流,它是不須要被編碼的
        > 在上傳文件時enctype屬性必須設置爲:multipart/form-data
            它表示將咱們的表單設置爲一個多部件的表單,當表單設置爲該值時,那麼咱們的一個表單項會做爲一個部件,發送到服務器。
                當使用多部件表達式,請求體會使用相似這樣的-----------------------------7e01ce2921096c分割符來分割。
        > 當表單設置爲多部件表單之後,咱們的request.getParameter()就廢了。       
 
    [3] FileUpload
        > commons-fileupload
        > commons-fileupload是Apache出的一款專門用來處理文件上傳的工具,
            使用它能夠自動去解析多部件表單。
        > commons-fileupload依賴於commons-io
        > 使用它須要導入兩個jar包:
            commons-fileupload-1.3.1.jar
            commons-io-1.4.jar
        > 核心類:
            DiskFileItemFactory
                - 工廠類,用來構建解析器
            ServletFileUpload
                - 解析器類,用來解析請求報文
            FileItem
                - 解析器將解析到的內容封裝爲FileItem對象
                - 方法:
                    boolean isFormField() --> 判斷當前表單項是不是普通表單項,若是是普通表單項返回true,不然返回false
                    String getContentType() --> 獲取文件的類型,返回是一個MIME值
                    String getFieldName() --> 獲取表單項的name屬性值
                    String getName() --> 獲取上傳文件的名字
                    long getSize() --> 獲取文件的大小(字節)
                    String getString(String encoding) --> 獲取用戶填寫value值,須要傳一個字符集
                    void write(File file) --> 將文件寫入磁盤中
 
        > 如何使用:
            1.獲取工廠類實例
            2.獲取解析器類實例
            3.解析請求報文獲取FileItem對象
 
    [4] 細節
        >  部分瀏覽器在上傳文件時,文件名使用的是文件的絕對路徑。
            而在保存文件時,使用絕對路徑會出現問題,文件不能正常寫入到服務器中。
        > 因此這種狀況咱們須要作一些處理:
            C:\asd\zxc\Desktop\qwe\ert\rrrr.jpg
            因此這種文件名,咱們須要對它進行截取字符串的操做,從最後一個\之前的內容全都不要
 
        > 當咱們上傳文件時,頗有可能多個用戶上傳同名文件,這樣會致使後上傳的文件覆蓋舊文件,
            咱們能夠爲圖片添加一個惟一的標識做爲前綴:惟一標識_rrrr.jpg。
            這裏咱們的惟一標識使用UUID
 
        > 文件大小的限制
            - 限制文件大小的操做,都是經過解析器對象ServletFileUpload來進行
            1.單個文件大小的限制
                - 限制文件大小爲60kb
                    fileUpload.setFileSizeMax(1024*60);
                - 當上傳的文件超過限制,程序會拋出異常:
                    FileSizeLimitExceededException
                - 咱們能夠對該異常進行捕獲,而後顯示一個錯誤消息   
 
            2.文件總大小的限制
                - 限制文件總大小爲150KB
                    fileUpload.setSizeMax(1024*150);
                - 當上傳文件的總大小超標是,會拋出以下異常:
                    SizeLimitExceededException
                - 咱們能夠對該異常進行捕獲,而後顯示一個錯誤消息   
 
2.文件的下載
    [1] 簡介
        > 將服務器中的文件下載到本地
        > 下載文件很簡單,直接把文件放到服務器中,而後爲瀏覽器提供一個超連接便可,
            可是若是瀏覽器支持當前文件格式,瀏覽器會自動打開文件,不會直接下載。
        > 若是將文件直接放到服務器中,當用戶下載文件時不會有任何的限制,不能去檢查用戶的權限。
            因此通常咱們下載時咱們將文件放到WEB-INF文件夾下,讓用戶經過訪問一個Servlet來進行下載。
 
    [2] 下載所須要的內容
            1.獲取到文件的流
            2.設置兩個響應頭
 
    [3] 下載相關的兩個響應頭
        1) 文件類型 Content-Type --> 文件的MIME類型   
            - 下載的文件的類型,須要設置一個MIME值
            - 文件的MIME類型能夠經過總的web.xml進行查詢
            - 咱們也能夠經過ServletContext的getMimeType()方法來獲取文件的MIME類型
 
        2) 下載文件的信息 Content-Disposition --> attachment; filename=文件名
            - Content-Disposition這個頭用來告訴瀏覽器如何處理文件
            - 值 attachment; filename=文件名,這個值就是告訴瀏覽器我發給你的是一個附件,請你下載
                filename用來指定文件的名字。
 
        3) 中文亂碼問題:
            > 在響應頭中不能直接設置中文,若是非得設置,必須對文件名進行url編碼。
                fileName = URLEncoder.encode(fileName, "utf-8");
                大部分瀏覽器能夠採用以上方式
            > 可是FireFox它是使用Base64進行的編碼,因此若是是火狐,使用上述方式,依然很差使。
                火狐的編碼方式:fileName = "=?utf-8?b?"+new BASE64Encoder().encode(fileName.getBytes())+"?=";
            > 可是火狐的方式IE又不支持了,若是咱們須要同時兼容這兩款瀏覽器,在設置編碼是必須作一個判斷,
                若是是IE瀏覽器,則使用 fileName = URLEncoder.encode(fileName, "utf-8");
                    若是是Firefox,則使用 fileName = "=?utf-8?b?"+new BASE64Encoder().encode(fileName.getBytes())+"?=";
            > 咱們能夠經過User-Agent的請求頭,來判斷瀏覽器的版本,若是頭中包含Firefox,則表示他是火狐。
            > 事例代碼:
                //判斷瀏覽器是不是火狐
                if(ua.contains("Firefox")){
                    //若是是火狐瀏覽器
                    fileName = "=?utf-8?b?"+new BASE64Encoder().encode(fileName.getBytes())+"?=";
                }else{
                    //其餘瀏覽器
                    //對文件名進行編碼
                    //encode()須要兩個參數,第一個被編碼的字符串,第二個是使用的字符集
                    fileName = URLEncoder.encode(fileName, "utf-8");
                }
 
            > 還有一種方式,不太講理,誰問跟誰急
            > 先是用gbk爲文件名進行編碼,再使用iso-8859-1進行解碼
                fileName = new String(fileName.getBytes("gbk"), "iso-8859-1");
            > 這種方式雖然簡單,可是有一些個別的字符會出問題。   
 
 
3.國際化(I18N)
    [1]國際化簡介
        > 國際化主要指咱們的應用對不一樣國家和地區的語言的支持。
        > 國際化主要指支持英文。
 
    [2]核心類
        ResourceBundle
            - 負責管理國際化資源文件,根據不一樣的國家和地區的信息去加載不一樣的國際化資源文件
 
        Locale
            - locale負責表示國家地區和語言的信息
 
    [3]國際化的原理
        國際化資源文件:   
            > 國際化資源文件實際上就是一個properties文件,它配置的都是一些鍵值對結構
            > 國際化資源文件要求必須放到類路徑下(src)
            > 命名規則:基礎名_語言_國家.properties
 
        ResourceBundle會根據不一樣Locale信息,去加載不一樣的國際化資源文件,從而達到國際化的目的。
 
 
 
 
    [4]格式化標籤庫
        > 還可使用JSTL中fmt標籤來完成國際化的操做。
        > 導入fmt標籤:
            <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>   
        > 經常使用標籤
            <fmt:setBundle basename="基礎名"/>
            <fmt:message key="屬性名" />
            <fmt:setLocale value="zh_CN"/>
            <fmt:formatDate value="<%=new Date() %>" type="both" dateStyle="full" timeStyle="full"/>
                value屬性:是被格式化的日期
                type屬性:日期的類型,date只顯示日期,time只顯示時間,both全都顯示
                dateStyle和timeStyle屬性:用來設置日期和時間的風格
                    可選值:full long medium short
        > 佔位符:
            在國際化資源文件中能夠指定帶佔位符的信息,佔位符從0開始,形式以下:
                WELCOME {0} TO OUR SITE, TODAY IS {1}
            在頁面中使用帶佔位符的消息,須要在message標籤中插入param子標籤,
                param子標籤用來指定替換站位符的內容,
                    第一個param會替換全部的{0}
                    第二個會替換全部的{1}
                    以此類推
            例子:
                <fmt:message key="info">
                    <fmt:param>
                        <span style="color: red;">大師兄</span>
                    </fmt:param>
                    <fmt:param>
                        <span style="color: red;"><fmt:formatDate value="<%=new Date() %>" type="both" dateStyle="full" timeStyle="full"/></span>
                    </fmt:param>
                </fmt:message>
 

 

轉載請註明出處!java

http://www.cnblogs.com/libingbin/web

感謝您的閱讀。若是文章對您有用,那麼請輕輕點個贊,以資鼓勵。瀏覽器

相關文章
相關標籤/搜索