Servlet实现文件上传的三种方法总结
介绍
文件上传是Web开发中常见的需求之一,可以通过Servlet实现。本文将总结Servlet实现文件上传的三种方法。
方法一:使用Apache的FileUpload
步骤:
- 下载Apache的FileUpload工具包,导入到项目中。
- 在Servlet中获取客户端上传的文件的输入流,然后使用FileItemFactory类和ServletFileUpload类分别解析和处理上传的文件。
示例:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String path = context.getRealPath("/upload");
String tempPath = context.getRealPath("/temp");
String contentType = request.getContentType();
if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) {
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置缓冲区大小,超过缓冲区大小的文件将被写入磁盘
factory.setSizeThreshold(4096);
factory.setRepository(new File(tempPath));
ServletFileUpload upload = new ServletFileUpload(factory);
//设置文件上传大小限制
upload.setSizeMax(4194304);
try {
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) {
String fileName = item.getName();
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
String filePath = path + "/" + fileName;
File uploadedFile = new File(filePath);
item.write(uploadedFile);
}
}
response.getWriter().println("上传成功");
} catch (Exception e) {
response.getWriter().println("上传失败");
}
}
}
方法二:使用Commons IO库
步骤:
- 下载Commons IO库,导入到项目中。
- 在Servlet中获取客户端上传的文件的输入流,然后使用FileUtils类将上传的文件保存到指定路径。
示例:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String path = context.getRealPath("/upload");
String tempPath = context.getRealPath("/temp");
File tempFile = new File(tempPath);
if (!tempFile.exists()) {
tempFile.mkdir();
}
String contentType = request.getContentType();
if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) {
try {
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置缓冲区大小,超过缓冲区大小的文件将被写入磁盘
factory.setSizeThreshold(4096);
factory.setRepository(tempFile);
ServletFileUpload upload = new ServletFileUpload(factory);
//设置文件上传大小限制
upload.setSizeMax(4194304);
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (!item.getName().equals("")) {
//获取上传的文件名
String fileName = item.getName();
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
String filePath = path + "/" + fileName;
File uploadedFile = new File(filePath);
//将上传的文件保存到指定路径
FileUtils.copyInputStreamToFile(item.getInputStream(), uploadedFile);
}
}
response.getWriter().println("上传成功");
} catch (Exception e) {
response.getWriter().println("上传失败");
}
}
}
方法三:使用Java的IO API
步骤:
- 在Servlet中获取客户端上传的文件的输入流,然后通过Java的IO API将上传的文件保存到指定路径。
示例:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String path = context.getRealPath("/upload");
File file = new File(path);
if (!file.exists()) {
file.mkdir();
}
String contentType = request.getContentType();
if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) {
try {
DataInputStream dis = new DataInputStream(request.getInputStream());
//根据长度创建字节数组,并将数据读入数组中
byte[] buffer = new byte[2048];
int length = dis.read(buffer);
while (length > 0) {
String fileName = new String(buffer, 0, length);
fileName = fileName.substring(fileName.indexOf("filename=\"") + 10);
fileName = fileName.substring(0, fileName.indexOf("\n"));
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.indexOf("\""));
String filePath = path + "/" + fileName;
byte[] buf = new byte[2048];
int len = 0;
FileOutputStream fos = new FileOutputStream(filePath);
while ((len = dis.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.close();
response.getWriter().println("上传成功");
}
} catch (Exception e) {
response.getWriter().println("上传失败");
}
}
}
总结
以上就是Servlet实现文件上传的三种方法,其中使用Apache的FileUpload和Commons IO库相对比较方便和快捷,推荐使用;而使用Java的IO API则要繁琐一些,不建议使用。在使用时,还需要注意设置文件上传大小限制,防止恶意攻击。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Servlet实现文件上传的三种方法总结 - Python技术站