常用组件化Web开发内容
1.文件的上传
(1)需要引入的 jar 文件:commons-fileupload-1.3.2、commons-io-2.5.jar。
<!-- 文件上传相关包:commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- 文件IO相关包:commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
(2)进行配置项的封装
#-- 配置参数封装成为成员变量
//1.文件上传保存在服务器地址的路径
private static final String UPLOAD_DIRECTORY = "D:\\uploadFiles";
// # 临时记忆存储大小(单位字节)
private static final int MEMORY_THRESHOLD = 1024 * 1024 * 3;
//# 最大文件大小(单位字节)
private static final int MAX_FILE_SIZE = 1024 * 1024 * 40;
//# 最大请求大小(单位字节)
private static final int MAX_REQUEST_SIZE = 1024 * 1024 * 50;
(3) 编写文件上传doPost方法
注意:文件上传请求只能使用post请求
3.1 判断请求是否是包含了媒体元素上传的请求
//1.检测是否为文件媒体元素上传
boolean multipartContent = ServletFileUpload.isMultipartContent(req);
if(!multipartContent){//不是包含了文件媒体元素上传的请求
Result res = new Result();
res.setCode("9999");
res.setMsg("不是一个标准的文件上传请求");
writer.print(res.toString());
writer.flush();
writer.close();
return;
}
3.2 通过工厂类来生产文件上传对象(加载配置过程)
//2.创建工厂类
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置临界值
factory.setSizeThreshold(MEMORY_THRESHOLD);
//设置临时存储的地址
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
//生成ServletFileUpload对象
ServletFileUpload upload = new ServletFileUpload(factory);
3.3 文件上传对象配置加载
// 设置最大文件上传值
upload.setFileSizeMax(MAX_FILE_SIZE);
// 设置最大请求值 (包含文件和表单数据)
upload.setSizeMax(MAX_REQUEST_SIZE);
//文件内容编解码字符集设置
upload.setHeaderEncoding("UTF-8");
3.4 获取上传的文件进行文件的写出
//1.获取所有请求提交的元素内容
int uploadCont = 0;//文件上传总数计数
try {
List<FileItem> fileItems = upload.parseRequest(req);
//判断请求提交是否有内容
if(fileItems != null&&fileItems.size()>0){//如果有内容在进行上传文件
for(FileItem item : fileItems){//遍历请求项目
if (!item.isFormField()){//当表单项目内容不是一个普通表单时(就是文件)
//获取上传的文件封装为对象
System.out.println("上传中:文件名:"+item.getName());
File file = new File(item.getName());
//封装文件输出路径和对象
String outPath = UPLOAD_DIRECTORY+"\\"+file.getName();
//封装一个输出的文件对象
File outFile = new File(outPath);
//调用输出方法写出到硬盘位置
item.write(outFile);
uploadCont++;
}
}
}
} catch (Exception e) {
System.err.println("文件上传出错");
e.printStackTrace();
res.setCode("9999");
res.setMsg("文件上传出错");
writer.print(res.toString());
writer.flush();
writer.close();
return;
}
res.setCode("0000");
res.setMsg("文件上传成功!");
res.setData(uploadCont);
writer.print(res.toString());
writer.flush();
writer.close();
(4)前端文件上传方法
4.1 表单提交方法
<form action="http://localhost:8090/webDemo/uploadFiles"
method="post" #---- 有文件上传的请求只能为post请求
enctype="multipart/form-data" #--- 文件上传必须要定义
>
<input type="text" name="name" />
<input type="file" name="uploadFile" />
<input type="file" name="uploadFile2" />
<input type="submit" value="上传" />
</form>
4.2 ajax文件上传方法
<form id="myForm">
<input type="file" name="file1" />
<input type="file" name="file2" />
</form>
<button type="button" onclick="toUp()">AJAX文件上传</button>
function toUp(){
//模拟一个表单数据
console.dir($("#myForm"));
var formData = new FormData($("#myForm")[0]);
$.ajax({
url:"http://localhost:8090/webDemo/uploadFiles",
type:"POST",
data:formData,
async:false,
dataType:"JSON",
cache:false,
contentType:false,
processData:false,
success:function(data){
console.dir(data);
},
error:function(XMLHttpRequest, textStatus, errorThrown){
console.dir("请求失败!");
}
});
}
(5) 项目开发中的文件上传管理
要求:
单个业务数据能关联相关的文件信息
要设计文件与数据关联的中间表
实现:
能查询数据关联的文件
(1)设计数据与文件对应关系表
drop table if exists t_files;
/*==============================================================*/
/* Table: t_files */
/*==============================================================*/
create table t_files
(
isDelete int comment '是否删除:1:删除 0:没删除',
ipaddress varchar(50) comment '操作者IP地址',
addTime datetime comment '添加时间',
updateTime datetime comment '修改时间',
deleteTime datetime comment '删除时间',
fileID varchar(50) not null comment '文件id',
bisID varchar(50) comment '关联业务id',
filePath varchar(300) comment '文件位置',
fileName varchar(50) comment '文件名称',
fileExt varchar(50) comment '文件后缀',
fileSize varchar(50) comment '文件大小',
primary key (fileID)
);
(2) 在文件上传时保存数据,改写文件名称
for(FileItem item : fileItems){//遍历请求项目
if (!item.isFormField()){//当表单项目内容不是一个普通表单时(就是文件)
//获取上传的文件封装为对象
System.out.println("上传中:文件名:"+item.getName());
File file = new File(item.getName());
//文件后缀
String fileName = item.getName();
int i = fileName.lastIndexOf(".");
String etx = item.getName().substring(i, item.getName().length());
//生成一个UUID的文件名(同时为关联表主键字段)
String pk = UUID.randomUUID().toString().replaceAll("-","").substring(0,20);
//封装文件输出路径和对象
String outPath = UPLOAD_DIRECTORY+"\\"+pk+etx;
//调用保存文件信息到文件关联表中 !!!!关键!!!!!
saveFileData(item,etx,pk,"user1",outPath);//模拟一个业务id为user1
//封装一个输出的文件对象
File outFile = new File(outPath);
//调用输出方法写出到硬盘位置
item.write(outFile);
uploadCont++;
}
}
//保存关联信息方法
/**
* 保存业务信息与文件信息关联表
* @param item 文件对象
* @param etx 文件后缀
* @param pk 文件名称
* @param user1 关联业务id
* @param outPath 文件保存位置
*/
private void saveFileData(FileItem item,String etx, String pk, String user1,String outPath) {
Connection con = MyC3P0Util.getCon();
String sql = "INSERT INTO `t_files` VALUES\n" +
"\t( 0, NULL, NULL, NULL, NULL, ?, ?, ?, ?, ?, ? );";
try{
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1,pk);
ps.setString(2,user1);
ps.setString(3,outPath);
ps.setString(4,pk);
ps.setString(5,etx);
ps.setString(6,item.getSize()+"");
ps.executeUpdate();
con.close();
}catch (SQLException e){
System.err.println("保存数据到文件表异常!");
e.printStackTrace();
}
}