- 准备工作
首先,在编写servlet实现文件上传、预览、下载、删除功能之前,需要先进行准备工作,包括:
- 建立一个Web项目
- 引入相关的jar包,如commons-fileupload.jar、commons-io.jar等
- 编写一个用于上传文档的html页面
-
定义文件上传后保存的路径
-
上传文件
上传文件是整个功能的核心部分,下面是实现文件上传的步骤:
2.1 在html页面中添加文件上传控件
<form method="post" action="uploadFileServlet" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="上传">
</form>
其中,form的method属性要设为post,action属性要指向实现文件上传功能的servlet,enctype属性必须设置为multipart/form-data,这个属性非常关键,因为默认值的话,浏览器会把文件名当成普通文本提交而不是文件。
2.2 编写servlet
@WebServlet(name = "uploadFileServlet", urlPatterns = {"/uploadFileServlet"})
@MultipartConfig
public class UploadFileServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 获取上传的文件
Part part = request.getPart("file");
// 获取文件名
String fileName = part.getSubmittedFileName();
// 保存文件到指定路径
part.write("/upload/" + fileName);
out.println("上传成功!");
}
}
- @WebServlet(name = "uploadFileServlet", urlPatterns = {"/uploadFileServlet"}):定义servlet的名称和处理请求的URL地址
- @MultipartConfig:使用multipart/form-data编码的表单数据时,需要在servlet上加@MultipartConfig注解,否则在获取上传文件的时候会报NullPointerException。
- 获取上传的文件:使用HttpServletRequest的getPart方法来获取上传的文件。其中,参数file与html页面中的input标签中的name属性的值相同,即该参数是文件上传控件的name属性的值。
-
保存上传的文件:使用write方法把上传的文件保存到指定路径。在这里,文件默认保存在Tomcat服务器的根目录的upload文件夹下。
-
预览文件
预览文件通常是指,用户点击某个按钮或链接后,可以在线浏览指定的文件,比如图片、视频、PDF文件等。下面是实现文件预览的步骤:
3.1 获取上传的文件
预览文件需要先获取上传的文件,获取方式同上。
3.2 添加servlet代码
@WebServlet(name = "previewFileServlet", urlPatterns = {"/previewFileServlet"})
@MultipartConfig
public class PreviewFileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 获取上传的文件
String fileName = request.getParameter("filename");
if (fileName == null || "".equals(fileName)) {
out.println("文件名为空!");
return;
}
// 获取文件的MIME类型
ServletContext context = getServletContext();
String mimeType = context.getMimeType(fileName);
if (mimeType == null) {
mimeType = "application/octet-stream";
}
response.setContentType(mimeType);
// 设置Content-Disposition以及文件名
String headerValue = String.format("attachment; filename=\"%s\"", fileName);
response.setHeader("Content-Disposition", headerValue);
// 获取文件的输入流
String filePath = "/upload/" + fileName;
InputStream in = getClass().getResourceAsStream(filePath);
// 把输入流写入到输出流中
OutputStream outStream = response.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
outStream.write(buffer, 0, bytesRead);
}
in.close();
outStream.flush();
outStream.close();
}
}
其中,
- @WebServlet(name = "previewFileServlet", urlPatterns = {"/previewFileServlet"}):定义servlet的名称和处理请求的URL地址
- 获取上传的文件:使用HttpServletRequest的getParameter方法来获取上传的文件名。
- 获取文件的MIME类型:使用ServletContext的getMimeType方法获取上传文件的类型。如果无法获取到MIME类型,则设置为"application/octet-stream"。
- 设置Content-Disposition以及文件名:用于提示浏览器以下载方式打开文件,然后把文件名保存到Content-Disposition中,这样在下载的时候就会默认使用该文件名。
- 把输入流写入到输出流中:通过 response.getOutputStream() 方法取得 ServletOutputStream 对象,然后使用输入流读取文件内容,并在ServletOutputStream中写入,这样文件内容就输出到浏览器中了。
同时,为了在html页面中能够显示文件预览按钮,可以添加如下代码:
<a href="previewFileServlet?filename=文件名" target="_blank">预览</a>
其中,要将filename参数设置为需要预览文件的文件名,target属性设置为"_blank"以在新窗口打开预览页面。
- 下载文件
如果用户需要下载文件,可以通过点击下载按钮或链接来实现。下面是实现文件下载的步骤:
4.1 获取上传的文件
下载文件需要先获取上传的文件,获取方式同上。
4.2 添加servlet代码
@WebServlet(name = "downloadFileServlet", urlPatterns = {"/downloadFileServlet"})
@MultipartConfig
public class DownloadFileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 获取上传的文件
String fileName = request.getParameter("filename");
if (fileName == null || "".equals(fileName)) {
out.println("文件名为空!");
return;
}
// 获取文件的MIME类型
ServletContext context = getServletContext();
String mimeType = context.getMimeType(fileName);
if (mimeType == null) {
mimeType = "application/octet-stream";
}
response.setContentType(mimeType);
// 设置Content-Disposition以及文件名
String headerValue = String.format("attachment; filename=\"%s\"", fileName);
response.setHeader("Content-Disposition", headerValue);
// 获取文件的输入流
String filePath = "/upload/" + fileName;
FileInputStream in = new FileInputStream(filePath);
// 把输入流写入到输出流中
OutputStream outStream = response.getOutputStream();
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = in.read(buffer)) != -1) {
outStream.write(buffer, 0, bytesRead);
}
in.close();
outStream.flush();
outStream.close();
}
}
其中,与预览文件的代码基本相同,区别在于设置Content-Disposition的值不同。同样,为了在html页面中能够显示文件下载按钮,可以添加如下代码:
<a href="downloadFileServlet?filename=文件名">下载</a>
其中,filename参数同预览文件一样,设置为需要下载的文件名。
- 删除文件
删除文件通常是指,用户选中某个文件后,点击删除按钮,可以删除指定的文件。下面是实现文件删除的步骤:
5.1 获取上传的文件
删除文件需要先获取上传的文件,获取方式同上。
5.2 添加servlet代码
@WebServlet(name = "deleteFileServlet", urlPatterns = {"/deleteFileServlet"})
@MultipartConfig
public class DeleteFileServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
// 获取上传的文件
String fileName = request.getParameter("filename");
if (fileName == null || "".equals(fileName)) {
out.println("文件名为空!");
return;
}
// 删除文件
String filePath = "/upload/" + fileName;
File file = new File(getServletContext().getRealPath(filePath));
if (file.exists()) {
file.delete();
}
out.print("删除成功!");
}
}
其中,使用File类的delete()方法来删除文件。同样,为了在html页面中能够显示文件删除按钮,可以添加如下代码:
<a href="deleteFileServlet?filename=文件名">删除</a>
其中,filename参数同预览文件一样,设置为需要删除的文件名。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:servlet实现文件上传、预览、下载、删除功能 - Python技术站