文件通过IO流上传到服务器,
图片不会存到数据库 因为图片太大了,数据库中存储的是图片的路径 显示图片的时候也是得到URL地址 然后从服务器中去取。(以后改进 用集群放图片,因为图片放在服务器影响服务器的效率)
1)标签用于在web页面中添加文件上传输入项,设置 文件上传输入项时须注意:必须要设置input输入项的name属性,否则浏览器将不会发送上传文件的数据。
2)必须把form的enctype属值设为multipart/form-data,这样才能知道我们提交的是文件
3)必须是post方式 get提交不了这么大的
使用Commons-fileupload组件实现文件上传,需要导入该组件相应的支撑jar包:Commons-fileupload和commons-io
改form表单,用io流上传,图片在上传完后会改名字,防指文件冲突,将地址发送给db。
文件上传实现步骤
1)创建DiskFileItemFactory对象,设置缓冲区大小和临时文件目录
2)使用DiskFileItemFactory 对象创建ServletFileUpload对象,并设置上传文件的大小限制。
3)调用ServletFileUpload.parseRequest方法解析request对象,得到一个保存了所有上传内容的List对象。
4)对list进行迭代,每迭代一个FileItem对象,调用其isFormField方法判断是否是上传文件
为普通表单字段,则调用getFieldName、getString方法得到字段名和字段值
为上传文件,则调用getInputStream方法得到数据输入流,从而读取上传数据。
// 1. 创建工厂对象
FileItemFactory factory = new DiskFileItemFactory();
// 2. 文件上传核心工具类
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置大小限制参数
upload.setFileSizeMax(10*1024*1024)// 单个文件大小限制
upload.setSizeMax(50*1024*1024); // 总文件大小限制
upload.setHeaderEncoding("gbk");// 对中文文件编码处理
// 判断是普通表单,还是带文件上传的表单
if (upload.isMultipartContent(request)) {
// 3. 把请求数据转换为list集合(包含文本数据和文件)
List<FileItem> list = upload.parseRequest(request);
// 遍历
for (FileItem item : list){
// 判断:普通文本数据
if (item.isFormField()){
// 获取名称
String name = item.getFieldName();
// 获取值
String value = item.getString();
System.out.println(value);
}
// 文件表单项
else {
/******** 文件上传 ***********/
// a. 获取文件名称
String name = item.getName();
// ----处理上传文件名重名问题----
// a1. 先得到唯一标记
String id = UUID.randomUUID().toString();
// a2. 拼接文件名
name = id + "#" + name;
// b. 得到上传目录
String basePath = getServletContext().getRealPath("/upload");
// c. 创建要上传的文件对象
File file = new File(basePath,name);
// d. 上传
item.write(file);
item.delete(); // 删除组件运行时产生的临时文件
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
文件下载