1、什麼是上傳和下載下傳?
資料上傳是指用戶端向伺服器上傳資料,用戶端向伺服器發送的所有請求都屬于資料上傳。檔案上傳是資料上傳的一種特例,指的是用戶端向伺服器上傳檔案。即将儲存在用戶端的檔案上傳至伺服器中的一個副本,儲存到伺服器中。
- 資料下載下傳是指用戶端從伺服器上擷取資料的過程。檔案下載下傳是資料下載下傳的一種特例,指的是用戶端從伺服器下載下傳檔案,即将原來儲存在伺服器中的檔案下載下傳到用戶端中一個副本儲存。通常我們對伺服器所發出的請求,大多數是檔案下載下傳請求,從伺服器中下載下傳文本、圖檔、聲音、視訊等檔案,然後由用戶端浏覽器對這些檔案進行解析後,才可能看到這些多媒體資訊。
- 但是我們這裡所說的檔案下載下傳,指的是檔案從伺服器下載下傳到浏覽器後,浏覽器并不直接解析,而是以附件的形式儲存到用戶端中。
- 上傳與下載下傳的檔案可以是文本檔案、圖檔、聲音、視訊等各種類型。
b8f92803d83bf1eeb80b10fbce113a91.png
2、檔案上傳的實作:
a、上傳時對表單的要求:
- 檔案上傳要求用戶端表單送出特殊的請求–multipart請求,即包含多部分資料的請求。是以檔案上傳表單對于表單資料的編碼類型要求,必須為multipart/form-data。即要為标簽指定enctype屬性值為“multipart/form-data”。(enctype,即encodingtype,編碼類型。)
- 由于用戶端上傳檔案的大小是不确定的,是以HTTP協定規定,檔案上傳的資料要存放于請求正文中,而不能夠出現在url的位址欄中,因為位址欄中可以存放的資料量太小。也就是說,檔案上傳的表單,必須送出POST請求,而不能夠送出GET請求。
這裡介紹的是用jsp+servlet實作的;
jsp表單代碼就不貼了,注意2點就行:
1、表單送出必須用post方式 (method=“post”)
2、設定表單enctype屬性為”multipart/form-data”
上傳
//指定檔案存放位置
String filePath = "/images";//這裡的斜杠表示項目根目錄
//建立檔案夾對象(未真正建立檔案夾)
File file = new File(filePath);
//如果指定路徑檔案夾不存在就建立一個檔案夾
if(!file.exists()) {
file.mkdirs();
/*file.createNewFile();//這裡的檔案對象建立時參數要加上file名*/
}
//建立SmartUpload對象
SmartUpload su = new SmartUpload();
//初始化SmartUpload對象
su.initialize(getServletConfig(),request,response);
//設定上傳檔案的最大值
su.setMaxFileSize(**);
//設定上傳檔案的總最大值
su.setTotalMaxFileSize(**);
//設定允許上傳檔案類型
su.setAllowedFilesList("jpg,gif,jpeg,png");
try {
//設定不允許上傳的檔案類型
//su.setDeniedFilesList("rar,txt,mp4,mp3,zip");
//上傳
su.upload();
Files files = su.getFiles();
com.jspsmart.upload.File file1;
for(int i=;i<files.getCount();i++ ) {
file1 = files.getFile(i);
//周遊上傳的所有檔案,設定檔案名,這裡用了自己寫的一個工具類UniqueId生成唯一id作為圖檔的id檔案名
file1.saveAs(filePath+"/"+UniqueId.getId()+Math.random()+"."+file1.getFileExt());
//儲存檔案到指定路徑,傳回上傳了多少個檔案
//int n = su.save(filePath);
//System.out.println("上傳了"+n+"個檔案");
System.out.println(file1.getFieldName());//表單的name值
System.out.println(file1.getFileName());//檔案名
System.out.println(file1.getSize());//檔案大小
System.out.println(file1.getFilePathName());//檔案原始路徑加檔案名
System.out.println(file1.getFileExt());//檔案類型
System.out.println("___________________________________");
System.out.println("___________________________________");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("上傳失敗!");
System.out.println(e.getMessage());
}
(在Eclipse中,預設會把Web項目放到Eclipse的工作空間下的.metadata.plugins\org.eclipse.wst.server.core\tmp0(或者是tmp1)\wtpwebapps\下)
在這裡可以找到你上傳成功的檔案
下載下傳
//超級簡單
String fileName = request.getParameter("fileName");
SmartUpload su = new SmartUpload();//建立對象
su.initialize(getServletConfig(), request, response);//初始化
try {
su.downloadFile("/images/"+fileName);//路徑加檔案名
//su.setContentDisposition();
} catch (SmartUploadException e) {
e.printStackTrace();
}
删除
String filePath = "/images/115049-106.jpg" ;//所在的項目路徑
filePath = getServletContext().getRealPath(filePath);//擷取真正路徑
System.out.println(filePath);
// 在指定路徑下建立指定名稱的檔案
File file = new File(filePath);//擷取檔案
file.delete();//删除
注意:
1,在上傳的時候送出表單的時候如果input項有非file類型的,在servlet使用request的時候不能直接使用,而是要用su.getRequest()代替,su是SmartUpload對象,而且要在su初始化和調用upload()方法之後再使用。
2,在輸入路徑的時候,應用SmartUpload上傳儲存檔案的時候可以用相對于項目的路徑,如“/”+上傳檔案夾,而在建立檔案夾要用硬碟真實路徑,可以用getServletContext().getRealPath(filePath)獲得,filePath指上面的相對于項目的路徑。
3,不知道為什麼用ajax無法和SmartUpload相容,能通路servlet執行post方法但是執行SmartUpload的代碼時有問題,可能是我自己的問題
開頭部分參考資料:http://blog.51cto.com/12402717/1977293