文件上传是开发中十分常见的功能,在servlet3.0之前,实现文件上传需要使用一些插件技术,比如:
但是在3.0之后servlet内部集成文件上传的技术(multipart),有关servlet3.0文件上传的实现过程如下:
页面端设置(upload.html)
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="myfile"/>
<button>上传</button>
</form>
服务端处理(UploadServlet.java)
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求编码
request.setCharacterEncoding("utf-8");
//获取服务端用于存储文件的目录
String baseDir = request.getServletContext().getRealPath("myfile");
//获取一个文件单元
Part part = request.getPart("myfile");
String type = part.getContentType();
long size = part.getSize();
String fname = part.getSubmittedFileName();
//存储到服务器
part.write(baseDir + File.separator + fname);
}
}
页面端设置
<form action="upload" method="post" enctype="multipart/form-data">
<input type="text" name="fname" placeholder="请输入文件名" /> <br />
<input type="file" name="myfile" multiple/>
<button>上传</button>
</form>
表单中文件控件中指定:multiple属性
服务端处理
package com.softeem.servlet;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Objects;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
/**
* @MultipartConfig 文件上传注解
* @WebServlet Selvlet容器注解
*/
@WebServlet("/UploadServlet2")
@MultipartConfig(
// 文件设置内存缓存的最大空间(当上传文件的字节数达到该值后使用零时文件缓存)
fileSizeThreshold = 1024 * 1024,
// 设置临时文件的存储目录
location = "d:/temp(临时缓存文件)",
// 设置允许上传的单个文件的最大限制
maxFileSize = 1024 * 1024 * 300,
// 设置表单允许提交的总字节数
maxRequestSize = 1024 * 1024 * 500)
public class UploadServlet2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
/*
* 多文件上传
*/
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
ArrayList<String> list = new ArrayList<>();
// 根据ServletContext(servlet上下文)获取到服务器的真实路径
// String baseDir = request.getServletContext().getRealPath("myfile");
/** 因为在server.xml里面配置过虚拟路径,所以上面路径与下面一样 */
String baseDir = "D:\\filesService";
// 获取一个文件单元集合
Collection<Part> parts = request.getParts();
parts.forEach(part -> {
// 获取文件类型
String type = part.getContentType();
// 获取文件名
String FileName = part.getSubmittedFileName();
// 文件大小
long size = part.getSize();
if ((FileName != null) && Objects.nonNull(FileName)) {
list.add(FileName);
}
System.out.println("文件类型:" + type);
System.out.println("文件名:" + FileName);
System.out.println("文件大小:" + size);
try {
// 根据文件路径写入到服务端(File.separator根据不同操作系统获取分隔符)windows是“\”
part.write(baseDir + File.separator + FileName);
} catch (IOException e) {
e.printStackTrace();
}
});
request.setAttribute("files", list);
request.getRequestDispatcher("listfiles.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
注解@multipartConfig中包含四个可设置的参数,分别为:
1. fileSizeThreshold 内存缓存的最大空间(当上传文件的字节数达到该值后使用临时文件缓存)
2. location 临时文件的存储目录
3. maxFileSize 允许上传的单个文件的最大限制
4. maxRequestSize 表单允许提交的总字节数
处理下载的jsp界面
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
文件下载
<% Object obj = request.getAttribute("files");
ArrayList names = (ArrayList)obj;
for(String name:names){
%>
<%=name %>
<%
}
%>
下载的服务端:
package com.softeem.servlet;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.softeem.File.utils.FileTools;
@WebServlet({ "/DownloadServlet", "/download" })
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("fname");
// 获取需要传输到客户端的文件路径
String path = "D:/filesService" + File.separator + name;
//文件下载
FileTools.download(path, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
封装的下载方法:
利用response里面的输出流,把文件下载到指定地方(浏览器默认位置),可以自己设置虚拟路径,就可以直接获取到服务器的路径,可以放在自己心中的地方,不用放在服务器默认地址,
虚拟路径设置:
通过配置tomcat虚拟路径可以实现,客户端对服务器内部磁盘中的文件资源进行访问,配置方式如下:
1. 找到tomcat服务器配置文件server.xml(位于conf目录中)
2. 在server.xml文件Host标签中插入以下代码
<Context docBase="D:\fileserver" path="/imgs" />
docBase表示为需要提供对外访问的目录路径,path为虚拟访问路径
**3.**浏览器地址栏中输入http://ip地址:端口/imgs/资源名称即可访问
封装的下载方法:
package com.softeem.File.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
public class FileTools {
/**
* 实现文件下载功能
* @throws IOException
*/
public static void download(String path,HttpServletResponse response) throws IOException {
//根据给定路径获取文件对象(需要传输到客户端的文件)
File file = new File(path);
//获取文件名
String name = file.getName();
// 1.获取需要输入文件的输入流
InputStream is = new FileInputStream(file);
// 2.获取response对象的输出流
ServletOutputStream os = response.getOutputStream();
// 设置文件名用URL编码,防止客户端下载出现乱码
name = URLEncoder.encode(name, "utf-8");
// 设置响应头的响应内容类型 content-disposition附件形式
response.setHeader("content-disposition", "attachment;filename=" + name);
// 3.读取输入流中的内容,并通过输入流输出
byte[] b = new byte[1024];
int len = 0;
while ((len = is.read(b)) != -1) {
os.write(b, 0, len);
}
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
}
}