控制文件长传的类型
在计算机中的文件可以划分出很多种类型,例如,图片就有JPG格式,GIF格式。CIF格式等,在上传文件时就需要对允许用户上传的文件类型进行控制。关键代码如下。
<%
<%
FileItem item=(FileItem) iter.next();
if(!item.isFormField()){ //文件表单字段
String fileName=item.getName();
//通过Arrays类的asList()方法创建固定长度的集合
List<String> fileType=Arrays.asList("gif","bmp","jpg");
String ext=fileName.subString(fileName.lastIndexof(".")+1);
if(!fileType.contains(ext)){// 判断文件类型是否在允许范围内
out.print("上传失败,文件类型只能是gif,bmp,jpg");
}else{
if(fileName !=null && fileName.equals("")){
File fullFile = new File(item.getName());
File saveFile = new File(uploadFilePath,fullFile.getName());
item.write(saveFile);
uploadFileName=fullFile.getName();
out.print("上传文件成功后的文件名是"+uploadFileName);
}
}
}
%>
%>
在上面的代码中我们使用到了Arrays类,此类包含用于操作数组(如排序和搜索)的各种方法,通过Arrays类的asList()方法创建固定长度的集合,也就是得到允许文件类型的集合,然后通过集合的contains()方法匹配上传文件的扩展名来判断文件类型是否在允许范围内。
控制文件上传的大小
在文件上传时除了要控制上传文件的类型,同时需要对上传文件的大小进行控制,关键实现代码如下。
<%
//…省略其他代码
//创建临时文件目录路径
File tempPatchFile = new File(“d:\temp\buffer\”);
if(!tempPatchFile.exists()){// 判断文件或目录是否存在
tempPatchFile.mkdirs();//创建指定的目录,包括所有必须但不存在的父目录
}
if(isMultipart){
DiskFileItemFactory factory=new DiskFileItemFactory();
//设置缓存区大小 4kB
factory.setSizeThreshold(4096);
//设置上传文件用到临时文件存放路径
factory.serRepository(tempPatchFile);
ServletFileUpload upload = new ServletFileUpload(factory);
//设置一个完整请求的最大允许大小
upload.setSizeMax(1024*30);
try{
//....省略其他代码
if(fileName != null && !fileName.equals("")){
File fullFile=new File(item.getName());
File saveFile=new File(uploadFilePath,fullFile.getName());
item.write(saveFile);
uploadFileName=fullFile.getName();
out.print("上传文件成功后的文件名是"+uploadFileName+",文件大小是:"+item.getSize()+"bytes!");
}
//......省略代码
}catch(Exception e){
out.print("上传失败,文件太大,全部文件的最大限制是:"+upload.getSizeMax()+"bytes!");
}
}
%>
运行代码,如果提交的文件大少超出了设置要求,那么系统会返回错误信息。
创建临时文件目录路径,通过DiskFileItemFactory对象的setSizeThreshold()方法设置缓存区大小,当上传文件大小超过缓冲区大小,则临时存储在通过DiskFileItemFactory对象的serRepository()方法设置的临时文件目录路径中。同时通过ServletFileUpload对象的setSizeMax()限制了一个完整请求的最大字节数,如果超出设置的字节数,则会抛出一个FileUploadBase.SizeLimitExceedeException类型的异常,并通过异常处理提示错误信息。