Servlet实现文件上传
Servlet是Java Web开发中非常常用的技术,它可以实现各种业务需求。其中,文件上传就是Web开发中非常常见的需求之一。
本文将详细讲解如何通过Servlet实现文件上传功能,并提供多文件上传的示例说明。
实现步骤:
- 在JSP页面中添加文件上传标签,如下所示:
<form action="upload" method="post" enctype="multipart/form-data">
<input type="file" name="file"><!--单文件上传-->
<input type="file" name="files" multiple><!--多文件上传-->
<input type="submit" value="上传"/>
</form>
注意:enctype
属性必须设为 multipart/form-data
,否则上传功能无法正常使用。
- 在Servlet中获取上传的文件,如下所示:
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
//获取上传的文件
Part filePart = request.getPart("file");
Collection<Part> fileParts = request.getParts("files");
}
- 对上传的文件进行保存操作,如下所示:
String fileName = getSubmittedFileName(filePart);//获取文件名
InputStream fileContent = filePart.getInputStream();//获取文件内容
String fileNamePrefix = "my_file";//文件名前缀
String uploadPath = "D:\\upload";//上传路径
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdirs();//如果路径不存在,则创建
}
String filePath = uploadDir.getAbsolutePath() + File.separator + fileNamePrefix + "_" + fileName;//保存文件路径
File file = new File(filePath);
file.createNewFile();//创建文件
OutputStream outputStream = new FileOutputStream(file);
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = fileContent.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);//写文件
}
outputStream.close();//关闭输出流
fileContent.close();//关闭文件内容流
- 返回上传结果,如下所示:
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("上传成功!");
out.flush();
out.close();
多文件上传
如果需要进行多文件上传,只需要稍作修改即可。具体修改如下所示:
- 在JSP页面中添加多文件上传标签。
<input type="file" name="files" multiple>
- 在Servlet中获取上传的多个文件。
Collection<Part> fileParts = request.getParts("files");
- 对每一个文件分别进行保存
for (Part filePart : fileParts) {
String fileName = getSubmittedFileName(filePart);//获取文件名
InputStream fileContent = filePart.getInputStream();//获取文件内容
//以下与单文件上传相同
String fileNamePrefix = "my_file";//文件名前缀
String uploadPath = "D:\\upload";//上传路径
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdirs();//如果路径不存在,则创建
}
String filePath = uploadDir.getAbsolutePath() + File.separator + fileNamePrefix + "_" + fileName;//保存文件路径
File file = new File(filePath);
file.createNewFile();//创建文件
OutputStream outputStream = new FileOutputStream(file);
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = fileContent.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);//写文件
}
outputStream.close();//关闭输出流
fileContent.close();//关闭文件内容流
}
示例
以下是一个完整的示例代码:
@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
Collection<Part> fileParts = request.getParts("files");
for (Part filePart : fileParts) {
String fileName = getSubmittedFileName(filePart);//获取文件名
InputStream fileContent = filePart.getInputStream();//获取文件内容
String fileNamePrefix = "my_file";//文件名前缀
String uploadPath = "D:\\upload";//上传路径
File uploadDir = new File(uploadPath);
if (!uploadDir.exists()) {
uploadDir.mkdirs();//如果路径不存在,则创建
}
String filePath = uploadDir.getAbsolutePath() + File.separator + fileNamePrefix + "_" + fileName;//保存文件路径
File file = new File(filePath);
file.createNewFile();//创建文件
OutputStream outputStream = new FileOutputStream(file);
byte[] buffer = new byte[4096];
int bytesRead = -1;
while ((bytesRead = fileContent.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);//写文件
}
outputStream.close();//关闭输出流
fileContent.close();//关闭文件内容流
}
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("上传成功!");
out.flush();
out.close();
} catch (IOException | ServletException e) {
e.printStackTrace();
}
}
private static String getSubmittedFileName(Part part) {
for (String cd : part.getHeader("content-disposition").split(";")) {
if (cd.trim().startsWith("filename")) {
String fileName = cd.substring(cd.indexOf('=') + 1).trim().replace("\"", "");
return fileName.substring(fileName.lastIndexOf('/') + 1).substring(fileName.lastIndexOf('\\') + 1); // MSIE fix.
}
}
return null;
}
}
总结
通过本文的讲解,我们了解了Servlet实现文件上传的基本思路和操作步骤,同时也提供了多文件上传的示例代码。对于Web开发中文件上传相关的需求来说,这个技能点还是非常实用的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Servlet实现文件上传,可多文件上传示例 - Python技术站