实现文件上传下载功能是一个常见的需求,Java 语言提供了多种方案可以实现该功能,本文将介绍使用 JavaWeb 中的 Servlet、JSP、File API 和 Apache Commons FileUpload 组件来实现文件上传下载功能的完整攻略。
上传文件
一、表单设计
表单需要有一个文件上传类型的 input:
<form action="uploadServlet" method="post" enctype="multipart/form-data">
<label for="file">选择文件:</label>
<input type="file" name="file" id="file">
<button type="submit">提交</button>
</form>
二、上传流程
当用户提交表单之后,Servlet 接收到请求,就可以通过 request.getParameter() 方法获取表单参数,例如表单中的文本框内容,而文件上传的数据是在 request 的输入流中,需要通过 ServletInputStream 进行读取。
Servlet API 已经封装好了读取文件上传数据的方法,可以通过 request.getPart(partName) 获取到上传的数据 Part,通过 Part.write(String fileName) 方法将数据写入到文件中即可。示例代码如下:
List<FileItem> items = new ServletFileUpload(
new DiskFileItemFactory()).parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) {
String fileName = item.getName();
InputStream fileContent = item.getInputStream();
byte[] buffer = new byte[1024 * 8];
OutputStream outStream = new FileOutputStream(new File(fileName));
int bytesRead;
while ((bytesRead = fileContent.read(buffer)) != -1) {
outStream.write(buffer, 0, bytesRead);
}
outStream.close();
}
}
三、示例代码
@WebServlet("/uploadServlet")
@MultipartConfig
public class FileUploadServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory())
.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) {
String fileName = item.getName();
InputStream fileContent = item.getInputStream();
byte[] buffer = new byte[1024 * 8];
OutputStream outStream = new FileOutputStream(new File(fileName));
int bytesRead;
while ((bytesRead = fileContent.read(buffer)) != -1) {
outStream.write(buffer, 0, bytesRead);
}
outStream.close();
}
}
response.getWriter().write("文件上传成功!");
}
}
下载文件
一、文件下载流程
文件下载需要通过 response 输出文件内容,并设置 Content-Disposition 定义浏览器是执行还是下载文件。
String fileName = request.getParameter("fileName");
File file = new File(fileName);
response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());
InputStream is = new FileInputStream(file);
byte[] buffer = new byte[1024 * 8];
int bytesRead;
OutputStream os = response.getOutputStream();
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
is.close();
二、示例代码
@WebServlet("/downloadServlet")
public class FileDownloadServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String fileName = request.getParameter("fileName");
File file = new File(fileName);
response.setHeader("Content-Disposition", "attachment;filename=" + file.getName());
InputStream is = new FileInputStream(file);
byte[] buffer = new byte[1024 * 8];
int bytesRead;
OutputStream os = response.getOutputStream();
while ((bytesRead = is.read(buffer)) != -1) {
os.write(buffer, 0, bytesRead);
}
os.close();
is.close();
}
}
三、下载链接
<a href="downloadServlet?fileName=xxx">下载文件</a>
上述示例代码中,"xxx" 为文件名,需要替换为实际文件名。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现文件上传下载功能 - Python技术站