在 Java Web 应用中实现文件上传和下载功能,可以通过以下步骤实现:
1. 文件上传
(1)在前端页面中添加一个文件上传表单。
(2)在后端代码中,通过 HttpServletRequest 对象获取上传的文件。可以使用 Apache Commons FileUpload 工具类来实现文件上传,具体步骤如下:
- 创建 DiskFileItemFactory 对象,并设置缓冲区大小和临时文件存放路径。
- 创建 ServletFileUpload 对象,并设置文件大小限制和字符集。
- 解析上传的文件,得到 FileItem 对象。
(3)将上传的文件保存到指定的目录中。
2. 文件下载
(1)在前端页面中添加一个下载链接或按钮。
(2)在后端代码中,通过 HttpServletResponse 对象设置下载文件的响应头信息,包括文件类型、文件名等。
(3)将指定的文件内容写入到 HttpServletResponse 的输出流中,实现文件下载。
实现文件上传和下载功能时需要考虑很多细节,如文件大小限制、文件名重复处理、文件后缀名过滤、文件下载时的中文乱码等问题。因此,建议使用成熟的第三方库来实现文件上传和下载功能,如 Apache Commons FileUpload 和 Apache POI 等。同时,也需要注意安全性问题,如防止文件上传时的文件类型攻击等。
以下是示例代码,实现了文件上传和下载功能:
文件上传:
```java
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 设置上传文件的存储路径
String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
// 判断上传文件的保存目录是否存在
File file = new File(savePath);
if (!file.exists() && !file.isDirectory()) {
System.out.println("目录不存在,需要创建");
// 创建目录
file.mkdir();
}
// 使用 Apache Commons FileUpload 解析上传的文件
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 1024); // 设置缓冲区大小为1M
factory.setRepository(new File(System.getProperty("java.io.tmpdir"))); // 设置临时文件存放路径
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8"); // 设置字符集
upload.setFileSizeMax(1024 * 1024 * 10); // 设置上传文件大小限制为10M
try {
// 解析上传的文件
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
// 判断当前 item 是否是上传文件
if (!item.isFormField()) {
// 获取上传文件的文件名
String fileName = item.getName();
// 处理上传文件的文件名,获取文件名部分
fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
// 获取上传文件的文件后缀名
String fileExtName = fileName.substring(fileName.lastIndexOf(".") + 1);
// 判断上传文件的文件类型是否合法
if (!Arrays.asList("jpg", "jpeg", "png", "gif", "bmp").contains(fileExtName.toLowerCase())) {
response.getWriter().write("上传文件的类型不合法!");
return;
}
// 生成新的文件名,避免文件名重复
String newFileName = UUID.randomUUID().toString() + "." + fileExtName;
// 在服务器端创建一个空文件
File storeFile = new File(savePath + File.separator + newFileName);
// 将上传文件写入到服务器端文件中
item.write(storeFile);
}
}
response.getWriter().write("文件上传成功!");
} catch (Exception e) {
e.printStackTrace();
response.getWriter().write("文件上传失败:" + e.getMessage());
}
}
}
```
文件下载:
```java
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取要下载的文件名
String fileName = request.getParameter("filename");
// 设置下载文件路径
String filePath = this.getServletContext().getRealPath("/WEB-INF/upload/" + fileName);
// 创建 File 对象
File file = new File(filePath);
// 判断要下载的文件是否存在
if (!file.exists()) {
response.getWriter().write("要下载的文件不存在!");
return;
}
// 设置响应头信息,告诉浏览器要下载文件
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("UTF-8"), "ISO8859-1"));
// 读取要下载的文件,写入到响应输出流中
FileInputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
```
在 web.xml 文件中配置 Servlet 映射:
```xml
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.example.UploadServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>DownloadServlet</servlet-name>
<servlet-class>com.example.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/download</url-pattern>
</servlet-mapping>
```
在前端页面中,上传文件的表单可以使用如下代码:
```html
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" />
<input type="submit" value="上传" />
</form>
```
下载文件的链接可以使用如下代码:
```html
<a href="download?filename=abc.jpg">下载文件</a>
```