最近在做如何實(shí)現(xiàn)文件上傳的相關(guān)工作,查閱了很多資料,發(fā)現(xiàn)網(wǎng)上寫的都不是很直觀,且調(diào)試復(fù)雜,經(jīng)實(shí)驗(yàn)成功。
把form的target設(shè)為頁(yè)面里一個(gè)看不見的iframe,這樣上傳時(shí)候就不會(huì)刷新頁(yè)面了,比如 :
托福答案 <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>
后臺(tái)方法代碼如下:
public void uploadFile(HttpServletRequest request) throws IOException {
//創(chuàng)建文件處理工廠,用于生成FileItem對(duì)象
DiskFileItemFactory difactory = new DiskFileItemFactory();
//設(shè)置緩存大小,如果上傳問(wèn)價(jià)超過(guò)緩存大小,將使用臨時(shí)目錄作為緩存
托福改分 difactory.setSizeThreshold(1024*1024);
//設(shè)置處理工廠緩存的臨時(shí)目錄,此目錄下的文件需要手動(dòng)刪除
// String realdir = request.getContextPath();//當(dāng)前應(yīng)用程序根路徑
托福答案 // System.out.println("realdir------------------"+realdir);
String dir = "D:/fileupload";
File filedir = new File(dir+"filetemp");
if(!filedir.exists()){
filedir.mkdir();
}
difactory.setRepository(filedir);
//設(shè)置文件實(shí)際保存的目錄
String userdir = dir + "files";
File fudir = new File(userdir);
if(!fudir.exists()){
fudir.mkdir();
}
//創(chuàng)建request的解析器,它會(huì)將數(shù)據(jù)封裝到FileItem對(duì)象中
ServletFileUpload sfu = new ServletFileUpload(difactory);
//解析保存在request中的數(shù)據(jù)并返回list集合
List list = null;
try{
list = sfu.parseRequest(request);
}catch(FileUploadException e){
e.printStackTrace();
}
//遍歷list集合,去除每一個(gè)輸入項(xiàng)的FileItem對(duì)象,并分別獲取數(shù)據(jù)
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{
//由于客戶端項(xiàng)服務(wù)器發(fā)送的文件時(shí)客戶端的全路徑,我們只需文件
String filename = fi.getName();
// int index = filename.lastIndexOf("\\");
// if(index != -1){
// filename = filename.substring(index+1);
//向服務(wù)器寫出文件
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);
}
//關(guān)閉流
if(in!=null){
try{
in.close();
}finally{
if(fos!=null){
fos.close();
}
}
}
// }
}
}
}