转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6073505.html 

一个功能完善的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、最后,就是把文件的相对路径信息保存到数据库中去,使文件得以在其他文件中通过相对路径进行引用了。

JavaWeb开发之网站实现文件上传功能相关推荐

  1. java前后端分离的实现方式_采用前后端分离的方式进行开发,实现了几种常用的文件上传功能...

    MyUploader-Backend 单文件上传,多文件上传,大文件上传,断点续传,文件秒传,图片上传 简介 采用前后端分离的方式进行开发,实现了几种常用的文件上传功能. 前端采用 vue.js + ...

  2. ios开发之使用多文件上传的简单封装最原始的

    ios开发之使用多文件上传的简单封装最原始的 // // ViewController.m // 18-上传多个文件 // // Created by 鲁军 on 2021/2/13. //#impo ...

  3. IOS开发基础之单文件上传基础最原始的方式

    IOS开发基础之单文件上传基础最原始的方式 info.plist 加入一行代码 <key>NSAppTransportSecurity</key><dict>< ...

  4. JavaWeb富文本编辑器与文件上传

    目录 一.富文本编辑器 1.下载富文本编辑器 2.富文本编辑器的应用 二.文件上传 文件上传必须要注意的规则: 文件上传案例 文件夹的访问 一.富文本编辑器 富文本编辑器在项目中很常见,它可以将文本, ...

  5. ie6多文件上传_一个好的“文件上传”功能必须要注意的这些点你都知道吗?

    检查上传文件扩展名白名单,不属于白名单内,不允许上传:[前端和后端都要做好校验] 上传文件的目录必须是http请求无法直接访问到的.如果需要访问的,必须上传到其他(和web服务器不同的)域名下,并设置 ...

  6. Android 实现文件上传功能(upload)

    文 件上传在B/S应用中是一种十分常见的功能,那么在Android平台下是否可以实现像B/S那样的文件上传功能呢?答案是肯定的.下面是一个模拟网站程 序上传文件的例子.这里只写出了Android部分的 ...

  7. jquery.form.js java_使用jQuery.form.js/springmvc框架实现文件上传功能

    使用的技术有jquery.form.js框架, 以及springmvc框架.主要实现异步文件上传的同时封装对象,以及一些注意事项. 功能本身是很简单的,但是涉及到一些传递参数类型的问题.例如:jque ...

  8. VS2010中使用NeatUpload实现简单的文件上传功能

    neatupload 一个免费的asp.net文件上传组件 项目地址 http://neatupload.codeplex.com/ 首先,从项目网站下载最新版(目前使用的是1.3.26) 在VS20 ...

  9. java批量上传文件_Spring boot 实现单个或批量文件上传功能

    一:添加依赖: org.springframework.boot spring-boot-starter-thymeleaf javax.servlet jstl org.apache.tomcat. ...

  10. Spring 文件上传功能

    本篇文章,我们要来做一个Spring的文件上传功能: 1. 创建一个Maven的web工程,然后配置pom.xml文件,增加依赖: 1 2 3 4 5 <dependency>     & ...

最新文章

  1. 5 亿微博数据疑泄露,Python 爬虫如何避免踩天坑?
  2. 大家对协同管理软件是怎么理解的?协同管理软件最主要需要解决企业/组织什么问题?
  3. 【译】Linux系统和性能监控(2)
  4. 单机 Oracle 11g(11.2.0.4)手动打补丁PSU(11.2.0.4.8)
  5. Http 协议 常用消息头
  6. 两个有序链表序列的交集
  7. Verify_Execute 验证SQL语句执行结果
  8. K8s CKS认证学习全套笔记
  9. 前端调用接口报错看不到报错响应时 console.dir
  10. Java菜鸟学习笔记--面向对象篇(十八):对象转型多态
  11. SQL SERVER执行计划详解
  12. excel 公式快速填充下拉方法(WPS表格)
  13. 关于hive报错expression not in group by key ‘.....‘
  14. 腾讯AlloyTeam招募Web工程师(社招/校招/实习生)
  15. 怎么把Word翻译成中文?建议收藏这些方法
  16. Java泛型方法与普通成员方法以及案例说明(五)
  17. 回车符,换行符的区别
  18. recycleview横向展开_Android开发之基于RecycleView实现的头部悬浮控件
  19. 第五讲 中断、异常和信号
  20. 混合高斯模型原理和Lucas-Kanade方法介绍

热门文章

  1. 电脑显示未安装任何音频输出设备_未安装任何音频输出设备-华硕A556UQ7200(4GB/128GB+500GB/2G独显)...
  2. PHP file_get_contents与file_put_contents
  3. windows10中安装anaconda和pytorch
  4. linux-dd命令,dd命令_Linux dd 命令用法详解:复制文件并对原文件的内容进行转换和格式化处理...
  5. LINUX编译libusb
  6. 犯罪与健康的统计关系
  7. JAVA读注册表获取My Document等目录
  8. libtool: Version mismatch error
  9. tdav_converter_video.cxx:49:9: error: ‘uint8’ does not name a type; did you mean ‘uint’?
  10. 在无锡调试的工作,到了泰安出错了