• 文件的上传和下载在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. MyBatis+Oracle实现主键自增长的几种常用方式

    一.使用selectKey标签 <insert id="addLoginLog" parameterType="map" > <selectK ...

  2. hbase入门-相关概念

    hbase入门-概念理解 参考文档: https://blog.csdn.net/luanpeng825485697/article/details/80319552 1.      hbase概念 ...

  3. SpringBoot 获得 properties 文件中数据方式

    参考:https://blog.csdn.net/qq_37171353/article/details/78005845

  4. 3_06_MSSQL课程_Ado.Net_接口、委托、事件、观察者模式

    1.接口——实现接口 2.委托.事件(定义事件.注册事件.触发事件) 3.接口和事件的区别,怎么分情况用? 4.观察者模式作为设计模式的一种,也称发布订阅模式. 应对类型的变化和个数的变化. 中介设计 ...

  5. 避免学习Linux走弯路

    我并不是一位Linux老鸟.在学习Linux的一路上.也是走了很多弯路,踩了不少坑.而今日就把自己趟过的那些坑给我们总结出来,期望能给初学Linux的童靴们带来一丝丝的帮助吧.文采可能没有那么高深,只 ...

  6. DAC

    DAC的功能:可以输出电压(无触发,设置DAC转换值,DAC使能更新寄存器和启动转换)或者波形(连续转换,用DMA发送数据,定时器触发).首先有个正弦波波形的数组,内存到DAC的DMA通道不断的将正弦 ...

  7. 使用eclipse创建一个简单的Java Web应用程序

    关于Java JDK/JRE.Tomcat的配置等等都没什么好说的,主要记录一下使用Eclipse创建web工程时的一些点以及说一说自己用IDEA的创建失败的过程(IDEA没运行成功...暂时不想弄了 ...

  8. 「SPOJ10707」Count on a tree II

    「SPOJ10707」Count on a tree II 传送门 树上莫队板子题. 锻炼基础,没什么好说的. 参考代码: #include <algorithm> #include &l ...

  9. :before 与 :after

    http://justcoding.iteye.com/blog/2032627  网址

  10. 「题解」JOIOI 王国

    「题解」JOIOI 王国 题目描述 考场思考 正解 题目描述 点这里 考场思考 因为时间不太够了,直接一上来就着手暴力.但是本人太菜,居然暴力爆 000 ,然后当场自闭- 一气之下,发现对 60pts ...