JavaWeb_常用功能_01_文件上传
一个功能完善的JavaWeb应用,必不可少的一个功能就是文件的上传。无论是用户的头像等,还是用户需要上传的一系列资料,都是通过文件的上传功能实现的。
目前我们实现网站中关于文件的上传功能时,常用的是apache的开源工具common-fileupload以及common-fileupload的依赖包common-io。
下面以一个注册页面的后台程序为例,大致讲解这两个包的使用:
首先,前往apache官网上面下载common-fileupload、common-io这两个包,并放入工程的WEB-INF文件夹的lib目录下。
然后,在网站页面的表单那里设置:
文件选择按钮为:<input type="file"/>
表单数据属性设置为:enctype="multipart/form-data"。因为只有使用enctype="multipart/form-data",表单才会把文件的内容编码到HTML请求中。
原理请移步:http://blog.csdn.net/mazhibinit/article/details/49667511 进行了解。
<form action="upload_do.jsp" method="post" enctype="multipart/form-data">
文件上传栏: <input type="file" size="30" name="upload" />
<input type="submit" value="提交上传" />
</form>
最后,在表单提交的目的jsp文件中使用两个包中的工具类进行文件的提取与保存,一般步骤如下:
1、实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload的一些基本设定。比如
DiskFileItemFactory dfif = new DiskFileItemFactory();
// 定义文件上传时的“运输船”大小。文件是一部分一部分上传的,这里设置为4K。当数据读取到4K则写入硬盘的临时文件夹中,清空运输船继续读取。
//文件传输完后,再从临时文件夹转存到实际的保存路径下 dfif.setSizeThreshold(4096); // 设置存放临时文件的目录如下:获取完整路径——修改路径新建临时文件夹——把临时文件夹设为工厂的默认目录(则工厂获取的内容会默认存放在这里)
String realwebbase = request.getSession().getServletContext().getRealPath("/");
File temp_file = new File(realwebbase+"upload/UploadTemp");
if (!temp_file.exists()) {
temp_file.mkdirs();
} dfif.setRepository(temp_file);
2、用工厂实例化上传组件,则该组件会使用该工厂实例的一系列配置(如:以多大容量为一次上传文件、临时文件存放处等)
ServletFileUpload sfu = new ServletFileUpload(dfif);
sfu.setHeaderEncoding("UTF-8");
// 设置上传文件的最大容量
sfu.setSizeMax(MAX_SIZE);
3、从request对象中把上传内容提取到一个list中。从上面引用的博文处可以看到,POST+multipart/form-data的效果是form表单内的内容以键值对的形式提交上去。
List fileList = null;
try {
fileList = sfu.parseRequest(request);
}
catch (FileUploadException e) { }
4、用迭代器遍历list对象,提取上传内容。上传内容主要分两种:文本与非文本内容(图片、多媒体文件等)
Iterator fileItr = fileList.iterator();
while (fileItr.hasNext()) {
FileItem fileItem = (FileItem) fileItr.next();
if(fileItem.isFormField()){ //第一种上传内容:普通文本,分别获取键名、值内容即可
String name = fileItem.getFieldName(); //获取键值对的键名
String value = fileItem.getString("UTF-8"); //此处的getString()是指对list的当前元素(键值对)的值,按照参数所指定的解码方式进行解析、获取内容
}else{ //第二种上传内容:非文本,则需要用到流传输来把内容读取、保存到具体的路径下
String path = fileItem.getName(); //获取文件的路径名,用于截取扩展名进行文件类型的判断// 得到文件的大小,用于判断文件大小是否合法
long size = fileItem.getSize();
if ("".equals(path) || size == 0) {
out.println("上传的文件无效!");
out.close();
return;
}
// 得到去除路径的文件名
String t_name = path.substring(path.lastIndexOf("/") + 1);
// 得到文件的扩展名(无扩展名时将得到全名)
String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1); //遍历允许的扩展名数组,看看上传文件的扩展名是否合法。
int i = 0;
boolean errorflag=true;
while (i < allowedExt.length) {
if (allowedExt[i].equals(t_ext)){
errorflag=false;
break;
}
i=i+1;
}
if (errorflag) {
out.println("请上传合法文件!");
out.close();
return;
}
// 用uuid+日期作为文件名的一部分来唯一标识文件
String uuid = UUID.randomUUID().toString();
String today = new SimpleDateFormat("yyyyMMdd").format(new Date());
//生成最终的文件保存完整路径:目录路径+日期+UUID+ . +扩展名
String u_name = realwebbase + "upload/" + today + "/" + uuid + "." + t_ext; try {
File _today_file = new File(realwebbase + "upload/Uploaded/" + _today); //构建文件目录
if (!_today_file.exists()) {
_today_file.mkdirs();
}
fileItem.write(new File(u_name)); //把当前list元素的值用write流写到创建好的路径下,即实现文件内容的保存了return;
}
catch (Exception e) {
e.printStackTrace();
} }
5、最后,就是把文件的相对路径信息保存到数据库中去,使文件得以在其他文件中通过相对路径进行引用了。
转自: http://www.cnblogs.com/ygj0930/p/6073505.html
JavaWeb_常用功能_01_文件上传的更多相关文章
- 常用Linux命令-文件上传和下载
rz 上传本地文件到远程服务器 sz fileName 下载文件到本地电脑 如果不能使用以上命令进行文件上传和下载需要安装命令,步骤如下: 1.软件安装1)编译安装root 账号登陆后,依次执行以下命 ...
- Ftp客户端需要TSL功能的文件上传
Ftp客户端需要TSL功能 1.由于最近做了一个项目,需要把打包的文件传输到对方的FTP服务器上,但是用普通的java连接ftp客户端总是连接不上去,对方却说ftp客户端需要开通TSL功能. 直接上代 ...
- C# web.config常用配置说明(文件上传大小、调试、session)
直接贴代码可好(后续用到的在更新) 黄色字体的为说明 <?xml version="1.0" encoding="utf-8"?><!-- 有 ...
- 转:MVC中的文件上传
上传文件与与上传数据区别 上传数据主要指json等简单字符串,上传文件指的是上传word.excel图片等.在上传数据的时候enctype默认为第一个application/x-www-form-ur ...
- Java 客户端操作 FastDFS 实现文件上传下载替换删除
FastDFS 的作者余庆先生已经为我们开发好了 Java 对应的 SDK.这里需要解释一下:作者余庆并没有及时更新最新的 Java SDK 至 Maven 中央仓库,目前中央仓库最新版仍旧是 1.2 ...
- 文件上传利器SWFUpload入门简易教程
凡做过网站开发的都应该知道表单file的确鸡肋. Ajax解决了不刷新页面提交表单,但是却没有解决文件上传不刷新页面,当然也有其它技术让不刷新页面而提交文件,该技术主要是利用隐藏的iFrame, 较A ...
- Node.js:上传文件,服务端如何获取文件上传进度
内容概述 multer是常用的Express文件上传中间件.服务端如何获取文件上传的进度,是使用的过程中,很常见的一个问题.在SF上也有同学问了类似问题<nodejs multer有没有查看文件 ...
- 7 款基于 JavaScript/AJAX 的文件上传插件
本文整理了7款基于JavaScript和AJAX的文件上传插件,这些插件基本上都能实现以下功能: 多文件上传 拖拽操作 实时上传进度 自定义上传限制 希望能为你的开发工作带来帮助. 1. jQuer ...
- 7款js文件上传插件
1. jQuery File Upload 具有多文件上传.拖拽.进度条和图像预览功能的文件上传插件,支持跨域.分块.暂停恢复和客户端图像缩放.可与任何服务端平台(如PHP.Python.Ruby ...
随机推荐
- js判断对象的属性是原型的还是实例的
一些情况下,我们需要知道对象的属性是原型的还是实例的,如果看代码的话比较繁琐,下面讲解下如何可以直接判断 1.hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的 ...
- python 3 关于requests库的 text / content /json
最近在爬SDFDA的数据,刚开始用urllib.request 库,一直连不到数据 : 后来通过CHROME浏览器的F12,发现该 网站用的是JSON格式{}'Content-Type': 'appl ...
- web开发之html5---html5 动画特效舞动的雨伞
http://www.cnblogs.com/stoneniqiu/p/4199294.html
- ios - 使用@try、catch捕获异常:
@try { // 可能会出现崩溃的代码 } @catch (NSException *exception) { // 捕获到的异常exception } @finally { // 结果处理 }
- python 基础 9.6 设计表结构
一. 设计表结构 在操作设计数据库之前,我们先要设计数据库表结构,我们就来分析分析经典的学生,课程,成绩,老师这几者他们之间的关系,我们先来分析各个主体他们直接有什么属性,并确定表结构,在实际开 ...
- Git客户端搭建环境(Windows系统)的使用
本文环境: 操作系统:Windows XP SP3 Git客户端:TortoiseGit-1.8.8.0-32bit 一.安装Git客户端 全部安装均采用默认! 1. 安装支撑软件 msysgit: ...
- socket java 实例
简单的java socket 示例 一.搭建服务器端 a).创建ServerSocket对象绑定监听端口. b).通过accept()方法监听客户端的请求. c).建立连接后,通过输入输出流读取客户端 ...
- 【python】-- Socket
socket socket本质上就是在2台网络互通的电脑之间,架设一个通道,两台电脑通过这个通道来实现数据的互相传递. 我们知道网络 通信 都 是基于 ip+port 方能定位到目标的具体机器上的具体 ...
- 【python】-- 队列(Queue)、生产者消费者模型
队列(Queue) 在多个线程之间安全的交换数据信息,队列在多线程编程中特别有用 队列的好处: 提高双方的效率,你只需要把数据放到队列中,中间去干别的事情. 完成了程序的解耦性,两者关系依赖性没有不大 ...
- Android系统移植与调试之------->如何修改Android默认字体大小和设置里面字体大小比例
因为我修改 ro.sf.lcd_density的值,将它从160修改 为120,所以导致整个系统的字体都变得很小.因此需要将整个字体变大,并且在设置-->显示-->字体大小的4个选项的值都 ...