jsp教程 用戶上傳頭像、上傳圖片、郵件上傳附件代碼
2. 頁面表單的實現
文件上傳表單和普通表單有兩個區別
1) 需要文件上傳字段
2) form 表單的 屬性需要指定為 /form-data
3. 服務器端解析
在 中通過 . 獲得表單上傳數據,會發現數據是分段發送的
由于自己寫程序解析有難度,我們可以使用 開發的開源組件-
需要導入 jar 包- 和-io
4 . 中處理文件上傳程序
// 1. 創建工廠類
= new ();
// 2. 創建對象
= new ();
// 3. 判斷是否是上傳表單
b = .();
if(!b) {
// 不是文件上傳
.("", "對不起,不是文件上傳表單!");
.("/.jsp").(, );
;
}
// 是文件上傳表單
// 4. 解析,獲得項
List = .();
// 5. 遍歷集合
for( item : ) {
// 判斷是不是普通字段
if(item.()) {
name = item.();
value = item.();
// 手工的轉換了
value = new (value.("iso-8859-1"),"utf-8");
.out.(name + "=" + value);
} else {
// 文件上傳字段
// 獲得文件名
= item.();
.out.();
= .(.("")+1);
.out.();
// 創建文件
= ();
dir = .("WEN-INF/");
File file = new File(dir, );
file.();
// 獲得流,讀取數據寫入文件
in = item.();
fos = new (file);
int len;
byte[] = new byte[1024];
while((len=in.read())>0)
fos.write(,0,len);
fos.close();
in.close();
item.(); // 刪除臨時文件
}
二、 文件上傳處理細節
1. 中文亂碼問題
1) 文件名中文亂碼問題,解決辦法: 告訴文件上傳組件以什么編碼方式來解碼文件名
.(“utf-8”);
. (“utf-8”);
2) 普通字段中文亂碼問題
.(“utf-8”);
2. 臨時文件
對于大文件不能緩存在內存,需要緩存到硬盤,為了方便管理,我們需要設置臨時文件存放目錄
// 設置臨時文件的存放位置
.(new File("d:/temp"));
文件上傳完畢需要刪除臨時文件,否則會導致服務器存在兩份上傳文件
// 注意,需要先將流進行關閉,否則會導致臨時文件無法刪除
out.close();
in.close();
// 刪除臨時文件
.();
3. 文件存放目錄
1) 目錄需要隱藏,禁止外界直接訪問
2) 文件名需要保證不重復
3) 文件應該分目錄存放
三、上傳進度條
1. 實現進度監聽
需要實現對文件上傳進度的監聽,需要給 對象添加
在方法中對與進度相關的數據進行處理
.(new () {
long num = 0;
void (long , long , int items) {
long = *100/;
if(==num)
;
num = ;
.out.("上傳進度:" + + "%");
// .().("", );
}
});
2. 在 jsp 頁面顯示進度
實驗:
1) 使用 發送請求,請求一個, 在 中返回響應,發送自增的num
此時會發現 會不停第想發送請求
2) 點擊文件上傳按鈕后jsp上傳圖片到服務器,立刻停止刷新jsp上傳圖片到服務器,直至上傳完畢頁面跳轉至新頁面
3)為了觀察實驗結果,將form 的 指定為 , 回送上傳完畢的結果
4) 出現上述問題的原因,瀏覽器不支持多線程同時訪問服務器只能同時發送一個請求,
這樣的訪問方式為同步訪問
5) 要在文件上傳的同時在中實現進度訪問,就需要ie瀏覽器與服務器進行異步交互