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
感謝您的閱讀。若是文章對您有用,那麼請輕輕點個贊,以資鼓勵。瀏覽器