文件上传:是把本地的文件上传到服务器中,在数据库中保存对应图片的名称即可。
文件下载:是把服务器中的文件下载到本地。
文件上传实现
jsp页面实现
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户添加</title>
</head>
<body>
<h3>用户注册页面</h3>
<form action="FileUpload" method="post" enctype="multipart/form-data">
<p>
姓名:<input type="text" name="name"/>
</p>
<p>
年龄:<input type="text" name="age"/>
</p>
<p>
分数:<input type="text" name="score"/>
</p>
<p>
文件:<input type="file" name="fil"/>${msg}
</p>
<p>
<input type="submit" value="提交"/>
</p>
</form>
</body>
</html>
[注]:
【A】method="post" 原因:
get方式数据的传输是依附于URL地址,URL中没有办法传输图片,因为URL传输的数据量有限制的。
【B】enctype文件传输的方式
默认值:application/x-www-form-urlencoded 按照普通文本传输
enctype="multipart/form-data" 按照二进制流的方式进行传输
Controller实现
@WebServlet("/FileUpload")
public class FileUpload extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决请求的中文乱码
//[1]创建文件上传的工厂对象
FileItemFactory factory =new DiskFileItemFactory();
//[2]获得文件上传的组件
ServletFileUpload fileUpload=new ServletFileUpload(factory);
fileUpload.setHeaderEncoding("utf-8");
String name="";
int age=0;
double score=0;
String filename="";
String filetype="";
try {
//[3]获得文件上传的表单对象 集合中包含的是所有的表单项内容
List<FileItem> list = fileUpload.parseRequest(req);
//item:是我们前台每一个表单项
for (FileItem item:list){
//System.out.println(item.getFieldName()+"--->"+item.getName()+"--->"+item.getSize()+"---->"+item.getContentType()+"--->"+item.isFormField());
if(!item.isFormField()){
//是文件表单项
// .jpg
String substring = item.getName().substring(item.getName().lastIndexOf("."));
//文件的类型
filetype=item.getContentType();
/******【F】指定上传文件的类型 .png .gif .jpg*************/
if(!(".png".equals(substring)||".gif".equals(substring)||".jpg".equals(substring))){
req.setAttribute("msg","文件类型只可以是图片");
req.getRequestDispatcher("/save.jsp").forward(req,resp);
return;
}
/*****【E】指定上传文件的大小********/
if(item.getSize()>20*1024){
req.setAttribute("msg","文件最大是20k");
req.getRequestDispatcher("/save.jsp").forward(req,resp);
return;
}
/****【D】使用UUID解决文件名称冲突问题*** f.l.jpg*****/
String uuid = UUID.randomUUID().toString();
filename=uuid+substring;
/****【C】动态获得服务器目录**/
String realPath = req.getServletContext().getRealPath("/upload");
//D:\Intermediate course\03demo\out\artifacts\pageS2_war_exploded/upload
System.out.println(realPath);
/****【B】解决文件目录不存在问题*********/
File file=new File(realPath);
if(!file.exists()){
file.mkdirs();
}
item.write(new File(file,filename));
}else {
//证明是普通表单项
if("name".equals(item.getFieldName())){
name = item.getString("utf-8");
}
if("age".equals(item.getFieldName())){
age = Integer.parseInt(item.getString());
}
if("score".equals(item.getFieldName())){
score =Double.parseDouble(item.getString());
}
}
}
Student student=new Student(0, name, age, score, filename, filetype);
StudentService studentService=new StudentServiceImpl();
int save = studentService.save(student);
if(save>0){
resp.sendRedirect(req.getContextPath()+"/StudentController2");
}else {
req.setAttribute("msg","添加失败");
req.getRequestDispatcher("/save.jsp").forward(req,resp);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
[注]:
/** 遇到的问题:
*
* 1、上传图片的时候名字中文乱码: ok
*
* A、 req.setCharacterEncoding("utf-8");
*
* B、fileUpload.setHeaderEncoding("utf-8");
*
* 2、上传的文件夹名称必须给出: ok
* file.exists()
*
* file.mkdirs()
*
* 3、上传不到当前服务器的路径中: ok
*
* req.getServletContext().getRealPath("/upload");
*
* 4、相同的图片名称会覆盖: ok
*
* String uuid = UUID.randomUUID().toString();
*
* 5、无法指定上传图片的大小: ok
*
* A、item.getSize()>20*1024
*
* B、fileUpload.setSizeMax(20*1024);
*
* 6、无法指定上传图片的类型:ok
*
* 7、普通表单项的值如何获得:
*
* item.getString();
* */
文件下载
jsp实现
<tr>
<th>用户ID</th>
<th>用户名称</th>
<th>用户年龄</th>
<th>用户分数</th>
<th>用户图片</th>
<th>操作</th>
</tr>
<c:forEach items="${list}" var="stu">
<tr>
<th>${stu.id}</th>
<th>${stu.name}</th>
<th>${stu.age}</th>
<th>${stu.score}</th>
<th><img src="/pageS2/upload/${stu.filename}" width="80px"> </th>
<th><a href="/pageS2/FileDownLoad?filename=${stu.filename}&filetype=${stu.filetype}">下载</a> </th>
</tr>
</c:forEach>
Controller实现
@WebServlet("/FileDownLoad")
public class FileDownLoad extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得服务器中目录
//
String realPath = req.getServletContext().getRealPath("/upload");
//获得需要下载的文件名称
String filename = req.getParameter("filename");
//文件类型
String filetype = req.getParameter("filetype");
File file =new File(realPath+"/"+filename);
//[1]把需要下载的图片读过来
InputStream inputStream =new FileInputStream(file);
//设置下载内容长度
resp.setContentLength((int) file.length());
//设置下载的类型
resp.setContentType(filetype);
//设置响应头
resp.setHeader("Content-Disposition","attachment;filename="+filename);
//[2]写到本地中
OutputStream outputStream =resp.getOutputStream();
//完成文件的读写操作
IOUtils.copy(inputStream,outputStream);
outputStream.close();
inputStream.close();
}
}