文件上传下载在研发时是经常用到,这里我就来总结下文件上传下载的步骤
1:新建web项目,导入进去两个jia包,没有jar包请自行去网上下载
2:在web界面编写表单
包含file文件域
表单必须以post方式提交
必须将表单上传的单位变为二级制enctype=”multipart/form-data”
<form action="UploadServlet" enctype="multipart/form-data"
method="post">
然后再UpLoadServlet中写代码
// 可以判断当前请求是不是二进制,如果不是可以终止代码
if (!ServletFileUpload.isMultipartContent(request)) {
return;
}
先贴上代码,下面我做下解释:
// 获得FileItemFactory类
// 能够创建文件输入流的工厂对象
FileItemFactory factory = new DiskFileItemFactory();
// 获得ServletFileUpload对象
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置最大上传大小
upload.setSizeMax(3 * 1024 * 1024);
// 设置上传字符集(好像不好用)
// upload.setHeaderEncoding("utf-8");
// 通过upload对象中的parseRequest方法获得FileItem类型的集合
List<FileItem> list = upload.parseRequest(request);
// 遍历所有表单元素
for (FileItem fi : list) {
// 迭代到当前表单元素如果是普通元素 这里是普通元素
if (fi.isFormField()) {
if (fi.getFieldName().equals("username")){
tx.setUsername(fi.getString("utf-8"));}
if (fi.getFieldName().equals("gender")){
System.out.println(fi.getString("utf-8"));
tx.setGender(fi.getString("utf-8"));}
} else {
// 如果是文件域
// 获得用户上传的文件名
// String filename = fi.getName();
if(!"".equals(fi.getName())||null!=fi.getName()){
// 使用时间偏移量和随机数来生成文件名,减少重复几率
String sui = (int) (Math.random() * 10000000) + "";
String shi = System.currentTimeMillis() + "";
//时间+随机数+上传文件名的后缀名
String filename;
try {
filename = shi
+ sui
+ fi.getName().substring(
fi.getName().lastIndexOf("."));
// System.out.println(filename);
// 获得项目在服务器计算机中的真实路径
String path = this.getServletContext()
.getRealPath("upload");
fi.write(new File(path + "/" + filename));
//设置tx对象中的imgname属性为filename
tx.setImgname(filename);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
通过jar中的ServletFileUpload类获取到表单中的值,然后给封装好的entity实体类赋值,然后添加到数据中表中,这里特别注意下一个文件名的问题,我来解释一下
我们作为服务端,客户端上传的图片名字可能一样,但是我们存到数据库的时候肯定不能一样,这样的话后面上传的图片就会被覆盖,我们需要对用户传来的图片进行命名,就是下面的代码
// 使用时间偏移量和随机数来生成文件名,减少重复几率
String sui = (int) (Math.random() * 10000000) + "";
String shi = System.currentTimeMillis() + "";
//时间+随机数+上传文件名的后缀名
String filename;
try {
filename = shi
+ sui
+ fi.getName().substring(
fi.getName().lastIndexOf("."));
// System.out.println(filename);
然后把用户上传的图片保存下来
// 获得项目在服务器计算机中的真实路径
String path = this.getServletContext()
.getRealPath("upload");
fi.write(new File(path + "/" + filename));
//设置tx对象中的imgname属性为filename
这样的话图片就保存在upload文件夹中了
对了,漏了一点,我给大家说下那个upload文件下
就是在webRoot下建的
这样的话就会在tomcat下出现这个文件夹,用户上传的图片就被保存到这里了
这里是就是一张客户端上传到服务器的的一张图片
以上内容都是图片上传操作,下面我来说一下图片下载,就是从服务器把图片下载到客户端,直接上代码。。
<td><a href="DownLoadServlet?imgname=${t.imgname }">下载</a></td>
这里是网页上下载,点击下载跳转到DownLoadServlet
这里代码大部分代码都是死的我就不详细解释了,有疑问的同学欢迎和我交流学习。。。
//获得要下载的文件
String fname = request.getParameter("imgname");
System.out.println(fname);
// 获得输入文件流
InputStream is = this.getServletContext().getResourceAsStream(
"upload\\" + fname);
// 设置响应类型为一个可下载的文件
response.setContentType("application/x-msdownload");
// 设置下载文件的文件名
String file = URLEncoder.encode("小冰库软件" + fname, "utf-8");
// 设置响应头文件配置
response.addHeader("Content-Disposition", "attachment; filename=\""
+ file + "\"");
// 输出流
ServletOutputStream out = response.getOutputStream();
byte[] bs = new byte[is.available()];
// 获得文件输入流
is.read(bs);
// 把文件输出到客户端
out.write(bs);
out.close();
is.close();