• 文件的上传和下载在web应用中是非常常用,也是非常有用的功能。

     例如:发送电子邮件时可以同过上传附件发送文件,OA系统中可以通过上传文件来提交公文,社交网站通过上传图片来自定义头像等等。

     例如:下载实际上只要资源放在用户可访问的目录中用户就可以直接通过地址下载,但是一些资源是存放到数据库中的,还有一些资源需要一定权限才能下载,这里就需要我们通过Servlet来完成下载的功能。

  • 可以说上传和下载是每一个web应用都需要具有的一个功能,所以需要我们掌握。
  • 文件的上传主要分成两个步骤

文件的上传

  用户在页面中选择要上传的文件,然后将请求提交到Servlet

   Servlet收到请求,解析用户上传的文件,然后将文件存储到服务器

创建上传文件的表单

  1. 创建一个form表单

    <formaction=""method="post"enctype="multipart/form-data">
    
        <inputtype="file"name="file"/><br/><br/>
    
        <inputtype="submit"value="上传"/>
    
    </form>
    

      

  文件上传的表单和之前的表单类似,但有以下内容需要注意

   表单的method属性必须为post

  表单的enctype属性必须为multipart/form-data

  上传文件的控件是intput,type属性为file

  该表单打开后是如下效果:

   IE

  Chrome

   火狐

  1. 编写Servelet。
  • 页面的表单控件创建好以后,选中文件点击上传按钮请求将会提交到指定的Servlet来处理。
  • 注意:这里不能再像以前的Servlet中那样,通过request.getParamter()来获取请求参数了,当enctype="multipart/form-data"时,再使用getParamter()获取到内容永远为空。因为浏览器发送请求的方式已经改变。
  • 既然以前的方法不能使用了,这里我们必须要引入一个新的工具来解析请求中的参数和文件,这个工具就是commons-fileupload。
  • commons-fileupload是Apache开发的一款专门用来处理上传的工具,它的作用就是可以从request对象中解析出,用户发送的请求参数和上传文件的流。
  • commons-fileupload包依赖commons-io,两个包需要同时导入。
  • 核心类:

commons-fileupload。

  1.DiskFileItemFactory

  • 工厂类,用于创建ServletFileUpload,设置缓存等
  • 该类一般直接使用构造器直接创建实例
  • 方法:

     public void setSizeThreshold(int sizeThreshold)

    用于设置缓存文件的大小(默认值10kb)

    public void setRepository(File repository)

    用于设置缓存文件位置(默认系统缓存目录)

  2.ServletFileUpload  

  • 该类用于解析request对象从而获取用户发送的请求参数(包括普通参数和文件参数)
  • 该类需要调用有参构造器创建实例,构造器中需要一个DiskFileItemFactory作为参数
  • 方法:

    public List<FileItem> parseRequest(HttpServletRequest request)

    解析request对象,获取请求参数,返回的是一个List,List中保存的是一个FileItem对象,一个对象代表一个请求参数。

    public void setFileSizeMax(long fileSizeMax)

    设置单个文件的大小限制,单位为B

    如果上传文件超出限制,会在parseRequest()抛出异常

    FileSizeLimitExceededException。

    public void setSizeMax(long sizeMax)

    限制请求内容的总大小,单位为B

    如果上传文件超出限制,会在parseRequest()抛出异常

    SizeLimitExceededException。

  3.FileItem

  • 该类用于封装用户发送的参数和文件,也就是用户发送来的信息将会被封装成一个FileItem对象,我们通过该对象获取请求参数或上传文件的信息。
  • 该类不用我们手动创建,由ServletFileItem解析request后返回。
  • 方法:

    String getFieldName()

    获取表单项的名字,也就是input当中的name属性的值。

    String getName();

    获取上传的文件名,普通的请求参数为null。

    String getString(String encoding);

    获取内容

    若为文件,将文件的流转换为字符串。

    若为请求参数,则获取请求参数的value。

    encoding参数需要指定一个字符集

    boolean isFormField();

    判断当前的FileItem封装的是普通请求参数,还是一个文件。

    如果为普通参数返回:true

    如果为文件参数返回:false

    String getContentType();

    获取上传文件的MIME类型

    long getSize();

    获取内容的大小

  • 实例代码,创建一个Servlet并在doPost()方法中编写如下代码:

    //创建工厂类
    
    DiskFileItemFactory factory = new DiskFileItemFactory();
    
    //创建请求解析器
    
    ServletFileUpload fileUpload = new ServletFileUpload(factory);
    
    //设置上传单个文件的的大小
    
    fileUpload.setFileSizeMax(1024*1024*3);
    
    //设置上传总文件的大小
    
    fileUpload.setSizeMax(1024*1024*3*10);
    
    //设置响应内容的编码
    
    response.setContentType("text/html;charset=utf-8");
    
    try {
    
        //解析请求信息,获取FileItem的集合
    
        List<FileItem> items = fileUpload.parseRequest(request);
    
        //遍历集合
    
        for (FileItem fileItem : items) {
    
           //如果是普通的表单项
    
           if(fileItem.isFormField()){
    
           //获取参数名
    
               String fieldName = fileItem.getFieldName();
    
           //获取参数值
    
               String value = fileItem.getString("utf-8");
    
               System.out.println(fieldName+" = "+value);
    
        //如果是文件表单项
    
            }else{
    
           //获取文件名
    
               String fileName = fileItem.getName();
    
           //获取上传路径
    
               String realPath = getServletContext().getRealPath("/WEB-INF/upload");
    
           //检查upload文件夹是否存在,如果不存在则创建
    
               File f = new File(realPath);
    
           if(!f.exists()){
    
                   f.mkdir();
    
               };
    
           //为避免重名生成一个uuid作为文件名的前缀
    
               String prefix = UUID.randomUUID().toString().replace("-", "");
    
           //将文件写入到服务器中
    
               fileItem.write(new File(realPath+"/"+prefix+"_"+fileName));
    
           //清楚文件缓存
    
               fileItem.delete();
    
            }
    
    }
    
    } catch (Exception e) {
    
        if(e instanceof SizeLimitExceededException){
    
           //文件总大小超出限制
    
           response.getWriter().print("上传文件的总大小不能超过30M");
    
        }elseif(e instanceof FileSizeLimitExceededException){
    
           //单个文件大小超出限制
    
           response.getWriter().print("上传单个文件的大小不能超过3M");
    
        }
    
    }
    
    response.getWriter().print("上传成功");
    

      

java文件的上传的更多相关文章

  1. java 文件的上传和下载

    主要介绍使用 smartupload.jar 包中的方法对文件的上传和下载.上传时文件是存放在服务器中,我用的是tamcat. 首先建立一个servlet 类,对文件的操作 package com.d ...

  2. java文件夹上传下载控件分享

    用过浏览器的开发人员都对大文件上传与下载比较困扰,之前遇到了一个需要在JAVA.MyEclipse环境下大文件上传的问题,无奈之下自己开发了一套文件上传控件,在这里分享一下.希望能对你有所帮助. 以下 ...

  3. java文件分片上传,断点续传

    百度的webUploader的前端开源插件实现的大文件分片上传功能 前端部分 前端页面代码如下,只需要修改自己的文件上传地址接口地址: <!DOCTYPE html> <html l ...

  4. java文件断点续传上传下载解决方案

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...

  5. Java 文件本地上传、下载和预览的实现

    以下方法为通用版本 实测图片和pdf 都没有问题 上传方法需要前端配合post请求 ,下载前端用a标签就可以,预览 前端使用ifrme标签   ,就可以实现基本功能... 1.文件本地上传 publi ...

  6. java 下载文件的两种方式和java文件的上传

    一:以网络的方式下载文件 try { // path是指欲下载的文件的路径. File file = new File(path); // 以流的形式下载文件. InputStream fis = n ...

  7. java文件夹上传下载组件

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  8. java文件夹上传

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  9. [Pulgin] 利用swfupload实现java文件批量上传

    URL:http://blog.csdn.net/xuweilinjijis/article/details/8876305 之前在网上找过很多相关资料,很多所谓的批量上传都是忽悠人的,真正的批量上传 ...

随机推荐

  1. iOS一个简单的设置圆角不引起性能问题的分类

    http://www.cocoachina.com/articles/18756 iOS设置圆角矩形和阴影效果 https://www.cnblogs.com/rayshen/p/4900336.ht ...

  2. Activiti工作流学习笔记一

    Activiti工作流 一:Activiti第一天 1:工作流的概念 说明: 假设:这两张图就是华谊兄弟的请假流程图 图的组成部分: 人物:范冰冰冯小刚王中军 事件(动作):请假.批准.不批准 工作流 ...

  3. 吴裕雄--天生自然PYTHON爬虫:使用Scrapy抓取股票行情

    Scrapy框架它能够帮助提升爬虫的效率,从而更好地实现爬虫.Scrapy是一个为了抓取网页数据.提取结构性数据而编写的应用框架,该框架是封装的,包含request异步调度和处理.下载器(多线程的Do ...

  4. jdk动态代理和cglib动态代理底层实现原理超详细解析(jdk动态代理篇)

    代理模式是一种很常见的模式,本文主要分析jdk动态代理的过程 1.举例 public class ProxyFactory implements InvocationHandler { private ...

  5. Java解析Json字符串--数组或列表

    Json示例: [ { "age": 25, "gender": "female", "grades": "三 ...

  6. AVL-Tree (平衡二叉树)

    看到网上AVL-Tree大多数都是用相同的实现方式 —— 递归进行插入.删除.维护平衡等,而我比较喜欢用带父指针的数据结构,于是想了一下午,用C实现了一个迭代版的. 由于没有暂时没有好的画二叉树的工具 ...

  7. Codeforces 1304E. 1-Trees and Queries

    简述题意,给你一课最小支撑树,对每个询问,在原有的路径上增加x-y,问a-b是否有路径长度为k的路,每条路每个点可以重复使用 由于是最小支撑树,我们可以用LCA来快速判断每个点之间的距离,那么现在就要 ...

  8. Python 基础之递归 递归函数 尾递归 斐波那契

    1.递归函数 定义:自己调用自己的函数递:去归:回有去有回是递归#(1)简单的递归函数def digui(n):    print(n)    if n > 0:        digui(n- ...

  9. 网络协议-restful协议

    REST Representational State Transfer, 是一种软件架构风格,提供一系列限制指导,用于更好的创建web service. 符合REST 架构风格的web servic ...

  10. PAT乙级完结有感

    去年10月开始刷的题,拖拖拉拉的终于借这个假期刷完了,总的来说还是有点小激动的,毕竟,第一次刷完一个体系,在这之前,我在杭电.南阳.洛谷.leetcode.以及我们自己学校的OJ上刷过,但都没有完完整 ...