Servlet 可以与 HTML form 标签一起使用,来允许用户上传文件到服务器。上传的文件可以是文本文件或图像文件或任何文档。
导入jar包
添加文件上传后,编码格式发生了改变,不能用getParameter来获取参数。
需要引入的 jar 文件:commons-fileupload-1.3.2、commons-io-2.5.jar。
创建包upload,用来存放上传文件
servletuploadt获取地址: https://pan.baidu.com/s/18jBRZZu2oV0SmxueTcWunw .
提取码:dkim
文件上传表单
在创建HTML文档时应注意:
- 表单 method 属性应该设置为 POST 方法,不能使用 GET 方法。
- 表单 enctype 属性应该设置为 multipart/form-data.
(上传的文件是以二进制的形式上传的,所以重新设置了编码格式) - 标签类型 type=“file”
<form id="fm" method="post" enctype="multipart/form-data">
<label for="pic" class="col-sm-2 control-label">照片</label>
<input type="file" name="pic" class="form-control" id="pic" placeholder="照片">
后台srevlet代码
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
FileUpload fileUpload = new FileUpload(diskFileItemFactory);
//中文乱码
fileUpload.setHeaderEncoding("UTF-8");
Map<String,String> map = new HashMap<>();
try {
List<FileItem> list = fileUpload.parseRequest(req);
for (FileItem fileItem : list) {//FileItem 表单项
if(fileItem.isFormField()){//判断是否是普通的表单项
map.put(fileItem.getFieldName(),fileItem.getString());
}else{//说明是 文件上传的表单项,处理上传文件,将上传文件保存到服务器的硬盘中
//获得到upload的目录(拼接路径)
String path = this.getServletContext().getRealPath("/")+"upload"+ File.separator;
String fileName = UUID.randomUUID().toString();
String suffix = fileItem.getName().substring(fileItem.getName().lastIndexOf('.'));
File file = new File(path+fileName+suffix);
fileItem.write(file);
//将路径存储到map中,以便存到数据库里
map.put(fileItem.getFieldName(),"/upload/"+fileName+suffix);
}
//System.out.println(fileItem.getFieldName()+":"+fileItem.getString()); //获得属性名
}
//获得到upload的目录(拼接路径)
获得图片存放的路径
String path = this.getServletContext().getRealPath("/")+"upload"+ File.separator;
产生一个随机的ID,用来区别存放的图片的名字
String fileName = UUID.randomUUID().toString();
获得图片的后缀
String suffix = fileItem.getName().substring(fileItem.getName().lastIndexOf('.'));