JavaWeb简单文件上传实战攻略
简介
本攻略基于JavaWeb开发,帮助初学者快速入门文件上传功能。我们将介绍一个基于Servlet/JSP的简单文件上传例子,包含完整的代码示例、攻略细节和实践体验。
文件上传流程
JavaWeb文件上传可以分为以下几个步骤:
- 表单设计 - 创建一个包含 file type input 元素的表单,实现文件上传UI.
- 解析文件 - 使用Java Servlet的api,解析multipart/form-data类型的表单数据.
- 验证文件 - 对文件大小、类型和命名等方面进行验证,并按需对文件进行压缩加密等操作.
- 存储文件 - 将验证合格的文件存储为某种形式,如磁盘上的文件或数据库表格.
下面我们将通过具体的案例加深理解.
示例一
步骤一:表单设计
下面是一个基本的表单设计,适用于文件上传的例子,使用multipart/form-data
编码类型:
<form method="post" action="upload.action" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="upload">
</form>
步骤二:解析文件
在Servlet中,我们使用Apache文件上传组件commons-fileupload 来完成文件上传功能。在解析时,要先判断请求的类型以及文件的大小等信息,以便判断文件是否会超过服务器的接收范围。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 文件上传处理:
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设定文件最大上传大小
factory.setSizeThreshold(1024 * 1024 * 10); // 10 MB
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(1024 * 1024 * 50); // 50 MB
// 解析上传文件
try {
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (!item.isFormField()) { // 非表单数据处理
String fileName = item.getName();
// ...
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
步骤三:验证文件
在接收到上传文件后,我们要根据一定的规则进行对文件进行验证,以确保文件的格式和大小符合要求。以下是一个简单的文件验证实现示例:
if (item.getSize() > 1024 * 1024) { // 文件大小不得超过1MB
System.out.println("File too big!");
continue;
}
if (!item.getContentType().startsWith("image/")) { // 文件类型必须为图片
System.out.println("File type error!");
continue;
}
步骤四:存储文件
解析完成后,我们要将验证合格的文件存储为某种形式,这里我们选择将文件存储在服务器的磁盘上:
String savePath = "data";
File saveDir = new File(savePath);
if (!saveDir.exists()) {
saveDir.mkdir();
}
String fileName = item.getName();
String filePath = savePath + File.separator + fileName;
File storeFile = new File(filePath);
item.write(storeFile);
示例二
步骤一:表单设计
下面是一个多文件上传的表单设计,使用multipart/form-data
编码类型:
<form method="post" action="multiUpload.action" enctype="multipart/form-data">
<input type="file" name="file" multiple>
<input type="submit" value="upload">
</form>
步骤二:解析文件
在Servlet中,我们使用Apache文件上传组件commons-fileupload来完成多个文件上传功能:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 多个文件上传处理:
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024 * 1024 * 10); // 10MB
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(1024 * 1024 * 50); // 50MB
// 解析上传文件
List<FileItem> items = upload.parseRequest(request);
// 文件列表
List<File> files = new ArrayList<>();
for (FileItem item : items) {
if (!item.isFormField()) { // 非表单数据处理
String fileName = item.getName();
if (fileName == null || fileName.trim().equals("")) {
continue;
}
fileName = fileName.substring(fileName.lastIndexOf(File.separator) + 1);
File storeFile = new File("data" + File.separator + fileName);
item.write(storeFile);
files.add(storeFile);
}
}
}
步骤三:验证文件
在接收到上传文件后,我们要根据一定的规则进行对文件进行验证,以确保文件的格式和大小符合要求。以下是一个简单的文件验证实现示例:
Long size = item.getSize();
String contentType = item.getContentType();
if (size > 1024 * 1024) {
System.out.println("文件大小超出限制!");
}
if (!"image/png".equals(contentType) && !"image/jpg".equals(contentType) && !"image/jpeg".equals(contentType)) {
System.out.println("文件类型不匹配!");
}
步骤四:存储文件
解析完成后,我们要将验证合格的文件存储为某种形式,这里我们选择将文件存储在服务器的磁盘上:
if (!file.exists()) {
file.mkdirs();
}
for (File f : files) {
String filePath = file.getAbsolutePath() + File.separator + f.getName();
if (!new File(filePath).exists()) {
f.renameTo(new File(filePath));
} else {
System.out.println("文件名已存在!");
}
}
总结
JavaWeb 文件上传是一个非常常见的功能,同时上传文件的实现也体现出了 Java 服务器端编程中一些重要的技术、原理和开发思想。使用文件上传组件完成文件上传功能,可以大大提高开发效率和文件上传的安全性。
本文中的示例代码仅仅是最基础的Java文件上传实现,实际应用中还需要考虑更多的情况。比如文件上传基于 Ajax 实现时的异常处理、文件重复命名,安全性检查等问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JavaWeb简单文件上传流程的实战记录 - Python技术站