文件上传与下载在Web开发中也是一项常见的功能
我们准备学习利用SmartUpload和FileUpload来实现文件上传与下载功能。
一、SmartUpload组件
1、概述
SmartUpload是专门用于实现文件上传及下载的免费组件。
2、SmartUpload优点
使用简单,编写少量代码,完成上传下载功能
能够控制上传内容
能够控制上传文件的大小、类型
3、SmartUpload缺点
SmartUpload目前已停止更新服务。
4、环境准备
在项目中引入jspsmartupload.jar文件,添加到WEB-INF\lib目录下
需要设置表单的enctype属性:
<form enctype="multipart/form-data" method="post">
二、案例演示:利用SmartUpload组件实现文件上传与下载
1、创建Web项目SmartUploadDemo
2、在WEB-INF目录里创建lib子目录,加入jspSmartUpload.jar
3.在web目录里创建上传子目录upload,用于存放上传文件
并在upload里存放一个图片文件scenery.jpg,后面用于测试下载功能。(随便找一张图片就行)
4、在web目录修改首页文件index.html
5、在web目录创建上传页面upload.html
并实现姓名和文件的非空校验
6、在web目录里创建处理上传的页面do_upload.jsp
运行程序,故意上传一个扩展名不符合要求的文件,看看会抛出什么异常
所以,我们要对文件上传语句作异常处理
重启服务器,上传不符合要求的文件,但是页面还是报500错误,而服务器端控制台并没有输出异常信息。
捕获异常语句应该修改如下:
此时,重启服务器,上传类型符合要求的文件,页面就不会报500错误了,只是显示空白页面,而服务器端控制台会输出异常信息。
程序出现异常,应该在页面上弹出一个消息框告知用户,代码修改如下:
运行程序,效果如下:
下面,我们来设置上传文件大小的关卡:
重启服务器,查看效果;
如果上传的文件类型与大小都符合要求,将file(内存)保存到服务器端指定位置
去掉扩展名:
再次完善:
启动服务器,查看运行效果::
下面,我们要显示上传的姓名以及图片。
重启服务器,查看运行效果::
但是这里还有点问题:如果你输入的名字是汉字,那么会有乱码
do_upload.jsp完整代码如下:
<%@ page import="com.jspsmart.upload.SmartUpload" %>
<%@ page import="com.jspsmart.upload.SmartUploadException" %>
<%@ page import="com.jspsmart.upload.File" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>显示上传数据</title>
</head>
<body>
<%!
// 声明文件名及扩展名
String filename, ext;
%>
<%
// 实例化上传组件
SmartUpload su = new SmartUpload();
// 初始化上传,绑定页面上下文
su.initialize(pageContext);
// 判断文件类型是否符合要求
try {
// 设置上传文件允许类型
su.setAllowedFilesList("jpg,gif,png,bmp");
// 上传文件
su.upload();
} catch (Exception e) {
// 弹出消息框告知用户,并且跳转到上传页面
out.print("<script type='text/javascript'>" +
" alert('只能上传jpg, gif, png或bmp文件!');" +
" window.location = 'upload.html';" +
"</script>");
}
// 获取第一个上传文件
File file = su.getFiles().getFile(0);
// 判断文件上传是否发生丢失现象
if (file.isMissing()) {
// 弹出消息框告知用户,并且跳转到上传页面
out.print("<script type='text/javascript'>" +
" alert('上传文件失败,请再次选择文件上传!');" +
" window.location = 'upload.html';" +
"</script>");
} else {
// 定义上传文件的最大尺寸(单位:字节)
long FILE_MAX_SIZE = 400000;
// 判断上传文件大小是否符合要求
if (file.getSize() <= FILE_MAX_SIZE) {
// 获取上传文件名(包含扩展名)
filename = file.getFileName();
// 获取上传文件扩展名
ext = file.getFileExt();
// 去掉扩展名
filename = filename.substring(0, filename.lastIndexOf("."));
// 对文件名进行utf-8转码
filename = new String(filename.getBytes(), "utf-8");
// 利用时间戳与随机整数修改文件名
filename = filename + String.valueOf(System.currentTimeMillis()) +
String.valueOf((int) (Math.random() * 900) + 100);
// 获取应用程序的真实路径(物理路径)
String realPath = application.getRealPath("/");
// 创建上传文件的url
String url = realPath + "upload\\" + filename + "." + ext;
// 将上传文件保存到服务器指定位置
file.saveAs(url, SmartUpload.SAVE_PHYSICAL);
// 提示用户上传成功
out.print("文件上传成功!<br/>");
out.print("保存位置:" + url + "<br/>");
} else {
// 弹出消息框告知用户,并且跳转到上传页面
out.print("<script type='text/javascript'>" +
" alert('上传文件太大,上传失败!');" +
" window.location = 'upload.html';" +
"</script>");
}
}
// 获取表单提交的姓名数据
String name = su.getRequest().getParameter("name");
// 对姓名数据进行utf-8转码
name = new String(name.getBytes(), "utf-8");
%>
姓名:<%= name %><br/>
照片:<br/>
<img src="upload/<%= filename %>.<%= ext %>" width="300" height="250">
</body>
</html>