他能帮我们减少了数据库服务器的压力,对数据的操作更加灵活。
所谓的文件上传就是服务器端通过request对象获取输入流,将浏览器端上传的数据读取出来,保存到服务器端。
在使用文件上传的时候,我们应该注意两个事项,浏览器端和服务器端的一些注意事项。
浏览器端的事项
首先一个form表单,他的method请求方式必须是post请求,而且必须设置属性encType=”multipart/form-data”。当然,表单里面肯定要有个文件上传控件也就是
<input type="file" name="xxx">注意name属性一定要有且必须要有值,这就是上传前浏览器端的注意事项。
服务器端的事项
request.getParameters()获取不到上传控件的参数,这里我们要使用
Apache 开源组织提供了一个用来处理表单文件上传的一个开源组件( Commons-fileupload ),下载地址点击打开链接,导入jar包后,创建DiskFileItemFactory,创建ServletFileUpload,通过ServletFileUpload的parseRequest方法得到所有的FileItem
具体步骤如下
//创建磁盘文件项工厂
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
//创建一个核心文件上传对象
ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
try {
//解析请求,获取所有上传组件
List<FileItem> list= fileUpload.parseRequest(request);
//获取每一个文件项
for (FileItem fileItem : list) {
//判断是否为普通组件
if(fileItem.isFormField()){
//是
//获取组件的的name值
String fieldName = fileItem.getFieldName();
//获取value 其中getString为获取普通组件的值并以utf-8编码接收
String value = fileItem.getString("utf-8");
}else{
//不是
//获取文件名
String filename = fileItem.getName();
//获取真实名称
String realName = UploadUtils.getRealName(filename);
//获取随机的文件名
String uuidName = UploadUtils.getUUIDName(realName);
//获取文件流
InputStream in = fileItem.getInputStream();
//获取服务器存储路径
String realPath = this.getServletContext().getRealPath("/products/1");
//创建输出流
FileOutputStream fos = new FileOutputStream(new File(realPath, uuidName));
//拷贝
IOUtils.copy(in, fos);
fos.close();
in.close();
fileItem.delete();
}
}
为了防止文件名重复,我们创建了一个工具类UploadUtils,这个工具类可以直接拿来使用
public class UploadUtils {
/**
* 获取随机名称
* @param realName 真实名称
* @return uuid
*/
public static String getUUIDName(String realName){
//realname 可能是 1.jpg 也可能是 1
//获取后缀名
int index = realName.lastIndexOf(".");
if(index==-1){
return UUID.randomUUID().toString().replace("-", "").toUpperCase();
}else{
return UUID.randomUUID().toString().replace("-", "").toUpperCase()+realName.substring(index);
}
}
/**
* 获取文件真实名称
* @param name
* @return
*/
public static String getRealName(String name){
// c:/upload/1.jpg 1.jpg
//获取最后一个"/"
int index = name.lastIndexOf("\\");
return name.substring(index+1);
}
/**
* 获取文件目录
* @param name 文件名称
* @return 目录
*/
public static String getDir(String name){
int i = name.hashCode();
String hex = Integer.toHexString(i);
int j=hex.length();
for(int k=0;k<8-j;k++){
hex="0"+hex;
}
return "/"+hex.charAt(0)+"/"+hex.charAt(1);
}
}