学习内容:学习JavaWeb(Day41)
1、文件的上传
2、文件的查看
3、文件的下载
4、使用工具类上传文件
5、基于servlet3.0以上的文件上传
1、文件的上传
(1)实现文件的上传需要的依赖包
commons-fileupload.jar
commons-io.jar
(2)在jsp文件创建上传文件表单
<!--创建可以上传文件的表单需要声明enctype="multipart/form-data-->
<form class="form-horizontal" action="/fileUpload" method = "post" enctype="multipart/form-data">
<div class="form-group">
<label class="col-sm-2 control-label">文件描述:</label>
<div class="col-sm-10">
<input type="text" name="desc" />
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">点击上传文件:</label>
<div class="col-sm-10">
<input type="file" name="myFile" />
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<input type="submit" value="提交">
</div>
</div>
</form>
(3)创建FileUploadServlet.java
@WebServlet("/fileUpload")
public class FileUploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("WEB-INF/views/file.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//判定当前提交表单是不是一个文件表单 是true 否false
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
try {
//构建factory对象用于ServletFileUpload构造方法中
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置上传文件时用的临时空间
ServletContext servletContext = this.getServletConfig().getServletContext();
File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");//文件的临时目录
factory.setSizeThreshold(1024); //设置临时空间大小
factory.setRepository(repository);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(1024*1024*20);//设置表单提交所有内容总长度
upload.setHeaderEncoding("UTF-8");//解决上传文件名的中文乱码
//获取表单中所有的输入项
List<FileItem> fileItems = upload.parseRequest(request);
for (FileItem item : fileItems) {
String contentType = item.getContentType(); //获取上传的文件类型
String fieldName = item.getFieldName();//获取控件name属性值
String name = item.getName();//上传的文件的文件名称
long size = item.getSize();//获取文件或文本大小
//如果表单中不包含文件
if(item.isFormField()){
String value = item.getString("UTF-8");
//tomcat容器默认采用了iso-8859-1的编码方法
//可以反解码成二进制在解码
//value = new String(value.getBytes("ISO8859-1"),"UTF-8");
System.out.println(value);
System.out.println("contentType:" + contentType + "filedName : "+ fieldName + "name: "+ name + "size:" + size);
}else{//表单中包含文件
System.out.println("contentType:" + contentType + "filedName : "+ fieldName + "name: "+ name + "size:" + size);
//获取上传文件的后缀名
int index = name.lastIndexOf(".");
String suffixName = name.substring(index);
//生成唯一文件名称
String randomName = UUID.randomUUID().toString();
String newName = randomName + suffixName;
//构建目录
File dir = new File("d:/img");
if(!dir.exists()){
dir.mkdir(); //创建单层目录 mkdirs() 创建多层目录
}
//构建文件
File file = new File(dir,newName);
InputStream is = item.getInputStream();
OutputStream os = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024*1024];
BufferedOutputStream bos = new BufferedOutputStream(os);
int len = -1;
while((len = bis.read(buffer)) != -1){
bos.write(buffer,0,len);
}
bos.flush();
bos.close();
bis.close();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
} else {
response.sendError(404, "文件表单设置有误!");
}
}
}
2、文件的查看
(1)创建查看文件的jsp页面
<html>
<head>
<title>Title</title>
<link rel="stylesheet" href="/css/bootstrap.min.css">
</head>
<body>
<img src="/img/show" class="img-circle" alt="" width="100" height="100">
</body>
</html>
(2)创建ShowFileServlet.java文件
@WebServlet("/img/show")
public class ShowFileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String dir = DirectoryUtil.FILE_DIR;
//查看exe文件时进行下载,
//查看word和excel文档时会下载一个zip包,想要查看需要下载插件
File file = new File(dir + "研发1固定资产横向表7.16.xlsx");
InputStream is = new FileInputStream(file);
//输出流为response.getOutputStream()
OutputStream outputStream = response.getOutputStream();
int len = -1;
while((len = is.read()) != -1){
outputStream.write(len);
}
is.close();
outputStream.close();
}
}
3、文件的下载
(1)创建DownLoadServlet.java文件
@WebServlet("/fileDownload")
public class DownLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("multipart/form-data");
File file = new File("d:/soft/typora-setup-x64.exe");
//设置文件的长度,下载时会有进度条
response.setContentLength(Long.valueOf(file.length()).intValue());
String fileName = new String(file.getName().getBytes("UTF-8"),"ISO8859-1");
//设置Content-Disposition,表示文件是被下载使用的。filename是下载的文件名
response.setHeader("Content-Disposition","attachment;filename=\""+fileName+"\"");
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());
int len = -1;
while((len = bis.read()) != -1){
bos.write(len);
}
bos.flush();
bos.close();
bis.close();
}
}
4、使用工具类上传文件
(1)创建上传工具类
public class UploadUtil {
public boolean upload(HttpServletRequest request) throws IOException, FileUploadException {
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (isMultipart) {
try {
//构建factory对象用于ServletFileUpload构造方法中
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置上传文件时用的临时空间
File repository = new File("d:/temp");
factory.setSizeThreshold(1024); //设置临时空间大小
factory.setRepository(repository);
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(1024*1024*10);//设置表单提交所有内容总长度
//获取表单中所有的控件
List<FileItem> fileItems = upload.parseRequest(request);
for (FileItem item : fileItems) {
String contentType = item.getContentType(); //获取上传的文件类型
String fieldName = item.getFieldName();//获取控件name属性值
String name = item.getName();//上传的文件的文件名称
long size = item.getSize();//获取文件或文本大小
if (item.isFormField()) {
String value = item.getString();
value = new String(value.getBytes("ISO8859-1"), "UTF-8");
System.out.println(value);
System.out.println("contentType:" + contentType + "filedName : " + fieldName + "name: " + name + "size:" + size);
} else {
System.out.println("contentType:" + contentType + "filedName : " + fieldName + "name: " + name + "size:" + size);
//获取上传文件的后缀名
int index = name.lastIndexOf(".");
String suffixName = name.substring(index);
//生成唯一文件名称
String randomName = UUID.randomUUID().toString();
String newName = randomName + suffixName;
//构建目录
File dir = new File("d:/img");
if (!dir.exists()) {
dir.mkdir(); //创建单层目录 mkdirs() 创建多层目录
}
//构建文件
File file = new File(dir, newName);
InputStream is = item.getInputStream();
OutputStream os = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024 * 1024];
BufferedOutputStream bos = new BufferedOutputStream(os);
int len = -1;
while ((len = bis.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.flush();
bos.close();
bis.close();
}
}
} catch (Exception e) {
throw new FileUploadException("文件上传异常", e);
}
return true;
} else {
return false;
}
}
}
(2)调用工具类
@WebServlet("/fileUpload")
public class FileUploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("WEB-INF/views/file.jsp").forward(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
UploadUtil uploadUtil = new UploadUtil();
try {
boolean result = uploadUtil.upload(request);
if(!result){
response.sendError(404,"表单设置有误!");
}
} catch (FileUploadException e) {
e.printStackTrace();
response.sendError(500,"文件上传异常");
return;
}
}
5、基于servlet3.0以上的文件上传
(1)增加注解@MultipartConfig
@WebServlet("/upload3")
@MultipartConfig(maxRequestSize = 10000,maxFileSize = 2000)//最大请求值,最大文件大小
public class FileUploadServlet3 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String desc = request.getParameter("desc");
System.out.println(desc);
//上传文件只有一个时 Part file = request.getPart("myFile");
Collection<Part> parts = request.getParts();
int count = 1;
for (Part part : parts) {
if (part.getName().equals("myFile")) {
InputStream is = part.getInputStream();
OutputStream os = new FileOutputStream(new File("d:/img/" + count + ".jpg"));
int len = -1;
while ((len = is.read()) != -1) {
os.write(len);
}
is.close();
os.close();
count++;
}
}
}
}