文件上传就是将本地文件写到服务器上
使用Servlet3.0新特性完成文件的上传【开发中通常使用FileUpload完成文件的上传】
文件上传使用的的方法【技术】:
- Servlet3.0: 注解式开发
- JSPSmartUpload:嵌入到JSP中完成文件上传。主要用于Model1年代的
- FIleUpload : Apache的文件上传组件。
- Strus2 : 底层是FileUpload
文件上传的三要素
表单的提交方式必须是POST
表单中需要有文件上传的表单要素:
- name属性和值:
表单中的encype属性值必须是multipart/form-data【因为文件上传需要的是二进制,默认的是非文件类型的数据,不会文件中的数据,只会有文件名】通过设置属性就能获得文件名和问价类容
文件上传的原理:
开发中直接使用框架
文件上传中会遇到的问题:
文件重名:
解决方法:在文件名前面添加一个UUID值
一个目录下存放过多的文件
解决方法:根据文件的类型来创建目录:文件的类型、文件的后缀名、时间分、用户分、数量分等。。。。。。。。
目录分离算法:**按位与运算
使用唯一文件名.hashCode(); – 得到一个代表当前这个文件的 int*类型值.**
* int**类型占4****个字节32****位.*可以让hashCode*值&0xf;* 得到一个int*值,*用这个int*值作为一级目录.**
让hashCode*右移4****位 &0xf ;*得到一个int*值,*用这个int*值作为二级目**
/*录.*依次类推.**
使用FileUpload实现文件的上传
步骤分析:
创建文件的工厂对象
得到解析器
解析request,获取所有的输入项对象
遍历集合
- 判断输入项是普通输入项还是文件的输入项
- 普通项:普通项目的API
- 文件项:文件名称和文件的输入流
完成流的对接
代码实现
Java
try {
//1.创建文件工厂对象
DiskFileItemFactory ds = new DiskFileItemFactory();
//2.得到解析器对象
ServletFileUpload sf = new ServletFileUpload(ds);
//3.解析request,得到所有输入项对象
List<FileItem> list = sf.parseRequest(request);
//4.遍历集合
for (FileItem fileItem : list) {
boolean flag = fileItem.isFormField();
//System.out.println(flag);
if(flag==true){//普通项
String fieldName = fileItem.getFieldName();
String value= fileItem.getString("utf-8");
System.out.println(fieldName+"::"+value);
}else{
String fileName = fileItem.getName();//获取文件的名称
//System.out.println(fileName);
InputStream in = fileItem.getInputStream();//获取文件的字节输入流
//获取服务器端的路径
String path = this.getServletContext().getRealPath("/upload");
//String a="path";
OutputStream out = new FileOutputStream(path+"/"+fileName);
//流的对接
int len=0;
byte[] b = new byte[1024];
while((len=in.read(b))!=-1){
out.write(b, 0, len);
}
out.close();
in.close();
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}