• 文件的上传和下载在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. IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解,DNS域名设计

    本文参考:<计算机网络: IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解> IP地址 概述 计算机要实现网络通信,就必须要有一个用于快速定位的网络地址.IP地址就是计算机在网络 ...

  2. 2019年ipa发布苹果应用商店审核指南

    https://baijiahao.baidu.com/s?id=1623886553597961077&wfr=spider&for=pc ipa 发布审核指南 说明: 本指南为初版 ...

  3. selenium webdriver 定位元素 第一部分

    static final WebDriver driver = ExplorerBase.IESetting(); // 实例化一个浏览器对象 @Test //@Ignore public void ...

  4. 端口打开和关闭do while

    ;Author : Bing Song ;// ;Usage: modify “logfile" according to actual drictory getdir logdir #获取 ...

  5. JSONObject遍历并替换部分json值

    今天做接口对接,在更新价格时,最开始传的值为整数,发现报错,询问对方后得知需要统一保留两位小数,没有则为.00,于是对原有JSONObject进行改造,遍历并替换其中的值.下面贴出代码: JSONOb ...

  6. 尝试实现一个简单的C语言string类型

    用过`C++/Java/python/matlab/JS`等语言后,发现都能很轻松的使用string类型,而C只能这样: char str[] = "hello world"; o ...

  7. Centos7 nginx的负载均衡概念与配置

    一.负载均衡概念 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单 ...

  8. /dev设备文件命名或符号链接建立

    udev是一个用户空间服务,负责监听内核设备变动事件,从/sysfs---中读取发生变动的设备属性信息,遍历 命名规则文件,进行属性规则的匹配,如果匹配,就进行执行命名自定义动作 udev 的规则和规 ...

  9. 二 sql语句,常用字段数据类型

    MySQL中常用DDL命令   database definition language  与 DML命令 :  database definition language 操作数据库: 创建数据库 : ...

  10. pip升级报错(权限问题)

    今天跟新pip的时候错一个接一个 看到拒绝访问应该是权限的问题,想起安装的时候选择谁可以使用软件(大概是这样的一个选项),选择了“只有我”,选择所有用户应该就不会存在这个问题了,那么怎么解决呢? 敲黑 ...