最近在做如何实现文件上传的相关工作,查阅了很多资料,发现网上写的都不是很直观,且调试复杂,经实验成功。
把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);
//防止上传的文件名字出现乱码
upload.setHeaderEncoding("UTF-8");
//解析保存在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();
}
}
}
// }
}
}
}