Java 文件上传练习案例:有限制的上传 (ch4.5ex_uploadLimited)
Java 文件上传练习案例:有限制的上传 (ch4.5ex_uploadLimited)
本案例以案例ch4.5_fileUpload(文件上传)为基础,实现文件上传功能,并加入了以下限制:
- 限制上传文件大小: 上传文件大小不能超过2MB。
- 判断文件类型: 不允许上传jsp文件,如果上传的是图片文件(jpg, jpeg, png, gif, bmp),则在页面上显示该图片。
页面测试效果如图4-11至4-14所示。
实现步骤:
-
创建Web项目ch4.5ex_uploadLimited:
- 将案例素材中的网页文件index.jsp和fileUpload.jsp复制到目录src/main/webapp。
- 将2个jar包commons-fileupload-1.4.jar和commons-io-2.5.jar复制粘贴到目录src/main/webapp/WEB-INF/lib。
-
文件选择页index.jsp:
- 包含一个文本框和文件域,文本框的默认值为'zhangsan'或自己姓名的全拼,用于指定上传文件的存放目录。
<%@ page language='java' contentType='text/html; charset=UTF-8'
pageEncoding='UTF-8'%>
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>文件上传</title>
</head>
<body>
<form action='fileUpload.jsp' method='post' enctype='multipart/form-data'>
<label>文件夹名称:</label>
<input type='text' name='folderName' value='zhangsan'><br>
<label>请选择文件:</label>
<input type='file' name='file'><br>
<input type='submit' value='上传'>
</form>
</body>
</html>
- fileUpload.jsp:
- 修改和补充代码,实现根据文本框输入的内容,创建文件存放目录,例如'uploadFolder/zhangsan'。
- 实现上传文件到该存放目录,并显示相关信息,如文件名、大小等。
- 如果上传的文件大小超过2MB,则不保存,并显示提示信息。
- 如果上传的是jsp文件,则给出不许上传的提示。
- 如果上传的是图片文件,则在页面上显示该图片,并设置图片的最大宽度和最大高度为300px。
<%@ page language='java' contentType='text/html; charset=UTF-8'
pageEncoding='UTF-8'%>
<%@ page import='java.io.*, java.util.*, org.apache.commons.fileupload.*, org.apache.commons.fileupload.disk.*' %>
<!DOCTYPE html>
<html>
<head>
<meta charset='UTF-8'>
<title>文件上传</title>
</head>
<body>
<%
// 设置上传文件的保存目录
String folderName = request.getParameter('folderName');
String savePath = getServletContext().getRealPath('/uploadFolder/' + folderName);
// 检查上传文件的保存目录是否存在
File file = new File(savePath);
if (!file.exists() && !file.isDirectory()) {
System.out.println(savePath + '目录不存在,需要创建');
// 创建目录
file.mkdir();
}
// 文件上传的处理
// 1、创建一个DiskFileItemFactory工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
// 2、创建一个文件上传解析器
ServletFileUpload upload = new ServletFileUpload(factory);
// 解决上传文件名的中文乱码
upload.setHeaderEncoding('UTF-8');
// 3、判断提交上来的数据是否是上传表单的数据
if (!ServletFileUpload.isMultipartContent(request)) {
// 按照传统方式获取数据
return;
}
// 设置上传单个文件的大小的最大值,目前设置为2MB
upload.setFileSizeMax(2 * 1024 * 1024);
try {
// 4、使用ServletFileUpload解析器解析上传数据,解析结果返回的是一个List<FileItem>集合,
// 每一个FileItem对应一个Form表单的输入项
List<FileItem> list = upload.parseRequest(request);
for (FileItem item : list) {
// 如果fileitem中封装的是普通输入项的数据
if (item.isFormField()) {
String name = item.getFieldName();
// 解决普通输入项的数据的中文乱码问题
String value = item.getString('UTF-8');
// value = new String(value.getBytes('iso8859-1'), 'UTF-8');
System.out.println(name + '=' + value);
} else {// 如果fileitem中封装的是上传文件
// 得到上传的文件名称,
String fileName = item.getName();
System.out.println('上传的文件名称:' + fileName);
if (fileName == null || fileName.trim().equals('')) {
continue;
}
// 获取上传文件的扩展名
int index = fileName.lastIndexOf('.');
String nameExt = fileName.substring(index + 1).toLowerCase();
if (nameExt.equals('jsp')) {
out.println('<script>alert('不允许上传jsp文件!');window.location.href='index.jsp'</script>');
return;
}
if (nameExt.equals('jpg') || nameExt.equals('jpeg') || nameExt.equals('png')
|| nameExt.equals('gif') || nameExt.equals('bmp')) {
// 如果是图片文件,则显示图片
InputStream in = item.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
while ((len = in.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
byte[] data = outStream.toByteArray();
String base64 = Base64.getEncoder().encodeToString(data);
out.println('<img src='data:image/' + nameExt + ';base64,' + base64 + '' style='max-width:300px;max-height:300px;'>');
in.close();
}
// 获取item中的上传文件的输入流
InputStream in = item.getInputStream();
// 创建一个文件输出流
FileOutputStream out = new FileOutputStream(savePath + '\' + fileName);
// 创建一个缓冲区
byte buffer[] = new byte[1024];
// 判断输入流中的数据是否已经读完的标识
int len = 0;
// 循环将输入流读入到缓冲区当中
while ((len = in.read(buffer)) > 0) {
// 使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + '\' + fileName)当中
out.write(buffer, 0, len);
}
// 关闭输入流
in.close();
// 关闭输出流
out.close();
// 删除处理文件上传时生成的临时文件
item.delete();
out.println('文件上传成功!');
}
}
} catch (FileUploadException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
%>
<br>
<a href='index.jsp'>返回上传页面</a>
</body>
</html>
注意事项:
- 以上代码示例仅供参考,实际应用中可能需要根据具体需求进行调整。
- 为了安全起见,建议对上传的文件进行校验,例如检查文件类型、大小、文件名等。
- 上传文件时,要考虑文件存储路径的安全性,避免恶意用户上传文件到系统敏感目录。
更多参考:
原文地址: https://www.cveoy.top/t/topic/mqXo 著作权归作者所有。请勿转载和采集!