最近在做如何實現文件上傳的相關工作,查閱了很多資料,發現網上寫的都不是很直觀,且調試復雜,經實驗成功。
把form的target設為頁面里一個看不見的iframe,這樣上傳時候就不會刷新頁面了,比如 :
托福答案 <form action="uploadFile" method="post" enctype="multipart/form-data" target="upload">
<input id="uploadfile" name="uploadfile" type="file"/><button>上傳至FTP</button>
</form>
<iframe name="upload" style="display:none"></iframe>
后臺方法代碼如下:
public void uploadFile(HttpServletRequest request) throws IOException {
//創建文件處理工廠,用于生成FileItem對象
DiskFileItemFactory difactory = new DiskFileItemFactory();
//設置緩存大小,如果上傳問價超過緩存大小,將使用臨時目錄作為緩存
托福改分 difactory.setSizeThreshold(1024*1024);
//設置處理工廠緩存的臨時目錄,此目錄下的文件需要手動刪除
// String realdir = request.getContextPath();//當前應用程序根路徑
托福答案 // System.out.println("realdir------------------"+realdir);
String dir = "D:/fileupload";
File filedir = new File(dir+"filetemp");
if(!filedir.exists()){
filedir.mkdir();
}
difactory.setRepository(filedir);
//設置文件實際保存的目錄
String userdir = dir + "files";
File fudir = new File(userdir);
if(!fudir.exists()){
fudir.mkdir();
}
//創建request的解析器,它會將數據封裝到FileItem對象中
ServletFileUpload sfu = new ServletFileUpload(difactory);
//解析保存在request中的數據并返回list集合
List list = null;
try{
list = sfu.parseRequest(request);
}catch(FileUploadException e){
e.printStackTrace();
}
//遍歷list集合,去除每一個輸入項的FileItem對象,并分別獲取數據
for(Iterator it = list.iterator();it.hasNext();){
FileItem fi = (FileItem)it.next();
if(fi.isFormField()){
System.out.println("FileFieldName"+fi.getFieldName());
System.out.println("FileString--->"+fi.getString());
}else{
//由于客戶端項服務器發送的文件時客戶端的全路徑,我們只需文件
String filename = fi.getName();
// int index = filename.lastIndexOf("\\");
// if(index != -1){
// filename = filename.substring(index+1);
//向服務器寫出文件
InputStream in = fi.getInputStream();
FileOutputStream fos = new FileOutputStream(fudir+"/"+filename);
byte[] buf = new byte[1024];
int len = -1;
while((len = in.read(buf))!=-1){
fos.write(buf,0,len);
}
//關閉流
if(in!=null){
try{
in.close();
}finally{
if(fos!=null){
fos.close();
}
}
}
// }
}
}
}