让我为您详细讲解“详解JavaWeb如何实现文件上传和下载功能”的完整攻略。
1. 文件上传功能的实现
1.1 准备工作
首先需要在web.xml中添加文件上传所需的过滤器和Servlet:
<!-- 文件上传过滤器 -->
<filter>
<filter-name>uploadFilter</filter-name>
<filter-class>org.apache.commons.fileupload.servlet.ServletFileUpload</filter-class>
<init-param>
<param-name>fileUploadThresholdSize</param-name>
<param-value>10240</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>uploadFilter</filter-name>
<servlet-name>uploadServlet</servlet-name>
</filter-mapping>
<!-- 文件上传Servlet -->
<servlet>
<servlet-name>uploadServlet</servlet-name>
<servlet-class>com.example.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>uploadServlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
还需要添加文件上传所需的依赖,比如apache-commons系列。
1.2 代码编写
接下来需要编写文件上传的Servlet类,代码如下:
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
private static final String TMP_DIR_PATH = "/tmp";
private static final String DESTINATION_DIR_PATH = "/uploads";
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 判断是否是文件上传表单
if (ServletFileUpload.isMultipartContent(request)) {
// 创建文件上传工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 1024); // 设置缓冲区大小(默认是10KB)
// 设置临时文件夹
File tmpDir = new File(TMP_DIR_PATH);
if (!tmpDir.exists()) {
tmpDir.mkdirs();
}
factory.setRepository(tmpDir);
// 创建文件上传器
ServletFileUpload uploader = new ServletFileUpload(factory);
uploader.setHeaderEncoding("UTF-8"); // 设置请求头编码
uploader.setSizeMax(1024 * 1024 * 10); // 设置上传文件的最大大小(默认是1MB)
// 设置上传文件的保存路径
File destinationDir = new File(getServletContext().getRealPath(DESTINATION_DIR_PATH));
if (!destinationDir.exists()) {
destinationDir.mkdirs(); // 如果目标文件夹不存在,则创建之
}
try {
// 解析Request请求
List<FileItem> items = uploader.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) { // 如果不是普通表单域
String itemName = item.getName();
// 保存文件(注意:需要对文件名进行处理,去掉路径等)
String filePath = destinationDir.getAbsolutePath() + "/" + itemName;
item.write(new File(filePath));
}
}
response.getWriter().write("文件上传成功!");
} catch (Exception e) {
response.getWriter().write("文件上传失败!" + e.getMessage());
}
} else {
response.getWriter().write("不是文件上传表单!");
}
}
}
最后只需要编写一个上传文件的表单即可:
<form action="upload" method="POST" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="上传"/>
</form>
1.3 实验验证
在项目中新建一个JSP页面,放置一个文件上传表单,上传一个文件并查看上传后文件的存储路径和文件名称是否正确。
2. 文件下载功能的实现
2.1 准备工作
和文件上传功能一样,需要在web.xml中添加文件下载所需的Servlet:
<servlet>
<servlet-name>downloadServlet</servlet-name>
<servlet-class>com.example.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>downloadServlet</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
2.2 代码编写
接下来需要编写文件下载的Servlet类,代码如下:
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
private static final String DESTINATION_DIR_PATH = "/uploads";
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取要下载的文件名
String fileName = request.getParameter("name");
if (fileName == null || fileName.isEmpty()) {
response.getWriter().write("文件名不能为空!");
return;
}
// 设置文件下载ContentType
response.setContentType("application/octet-stream");
// 设置Content-Disposition,让浏览器下载该文件
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
// 获取要下载的文件路径
String filePath = getServletContext().getRealPath(DESTINATION_DIR_PATH) + "/" + fileName;
File file = new File(filePath);
if (!file.exists()) {
response.getWriter().write("文件不存在!");
return;
}
// 下载文件
FileInputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(file);
out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
} catch (Exception e) {
response.getWriter().write("文件下载失败!" + e.getMessage());
} finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
最后只需要在点击下载按钮时向后台发送一个GET请求,同时将文件名作为参数传递给Servlet即可:
<a href="download?name=filename">下载文件</a>
2.3 实验验证
在项目中新建一个JSP页面,放置一个文件下载按钮,下载一个已经上传的文件并查看下载后文件的名称是否正确。
以上就是“详解JavaWeb如何实现文件上传和下载功能”的完整攻略,希望可以帮助您实现这两个功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解JavaWeb如何实现文件上传和下载功能 - Python技术站