`

servlet文件上传下载

阅读更多

一、文件上传入门

1. 应用:

 用户上传头像、上传图片、邮件上传附件等

2. 页面表单的实现

    文件上传表单和普通表单有两个区别

    1) 需要文件上传字段  <input type=”file” />

    2) form 表单的 enctype 属性需要指定为 multipart/form-data

3. 服务器端解析request

    Servlet 中通过 request.getInputStream 获得表单上传数据,会发现数据是分段发送的

由于自己写程序解析有难度,我们可以使用Apache 开发的开源组件Commons-fileupload

需要导入 jar Commons-fileupload Commons-io

4 . UploadServlet 中处理文件上传程序

 

// 1. 创建工厂类

DiskFileItemFactory factory = new DiskFileItemFactory();

// 2. 创建FileUpload对象

ServletFileUpload upload = new ServletFileUpload(factory);

// 3. 判断是否是上传表单

boolean b = upload.isMultipartContent(request);

if(!b) {

    // 不是文件上传

request.setAttribute("message", "对不起,不是文件上传表单!");

request.getRequestDispatcher("/message.jsp").forward(request, response);

    return;

}

// 是文件上传表单

// 4. 解析request,获得FileItem

List<FileItem> fileitems = upload.parseRequest(request);

// 5. 遍历集合

for(FileItem item : fileitems) {

    // 判断是不是普通字段

if(item.isFormField()) {

    String name = item.getFieldName();

    String value = item.getString();

    // 手工的转换了

    value = new String(value.getBytes("iso-8859-1"),"utf-8");

    System.out.println(name + "=" + value);

} else {

    // 文件上传字段

    // 获得文件名

    String filename = item.getName();

    System.out.println(filename);

    filename = filename.substring(filename.lastIndexOf("\\")+1);

   

    System.out.println(filename);

    // 创建文件

    ServletContext context = getServletContext();

    String dir = context.getRealPath("WEN-INF/upload");

    File file = new File(dir, filename);

    file.createNewFile();

   

    // 获得流,读取数据写入文件

    InputStream in = item.getInputStream();

    FileOutputStream fos = new FileOutputStream(file);

   

    int len;

    byte[] buffer = new byte[1024];

    while((len=in.read(buffer))>0)

       fos.write(buffer,0,len);

    fos.close();

    in.close();

    item.delete();    // 删除临时文件

}

 

 

二、 文件上传处理细节

1. 中文乱码问题

    1) 文件名中文乱码问题,解决办法: 告诉文件上传组件以什么编码方式来解码文件名

       ServletUpload.setCharacterEncoding(“utf-8”);

       request. setCharacterEncoding(“utf-8”);

    

    2) 普通字段中文乱码问题

       fileitem.getString(“utf-8”);      

 

2.   临时文件

    对于大文件不能缓存在内存,需要缓存到硬盘,为了方便管理,我们需要设置临时文件存放目录

    // 设置临时文件的存放位置

factory.setRepository(new File("d:/temp"));

 

    文件上传完毕需要删除临时文件,否则会导致服务器存在两份上传文件

// 注意,需要先将流进行关闭,否则会导致临时文件无法删除

out.close();

in.close();

// 删除临时文件

fileitem.delete();

 

3. 文件存放目录

    1) 目录需要隐藏,禁止外界直接访问

    2) 文件名需要保证不重复

    3) 文件应该分目录存放

 

三、上传进度条

1. 实现进度监听

    需要实现对文件上传进度的监听,需要给FileUpload 对象添加 ProgressListener

    upload方法中对与进度相关的数据进行处理

    upload.setProgressListener(new ProgressListener() {

    long num = 0;

    public void update(long bytesRead, long contentLength, int items) {

      

            long progress = bytesRead*100/contentLength;

           if(progress==num)

               return;

           num = progress;

           System.out.println("上传进度:" + progress + "%");

      

        //  request.getSession().setAttribute("progress", progress);

        }

    });

 

2. jsp 页面显示进度

    实验: 

    1) 使用 iframe 发送请求, 请求一个Servlet, Servlet 中返回响应,发送自增的num

       此时会发现 iframe 会不停第想Servlet发送请求

    2) 点击文件上传按钮后,iframe立刻停止刷新,直至上传完毕页面跳转至新页面

    3)为了观察实验结果,将form target 指定为 iframe UploadServlet回送上传完毕的结果

    4) 出现上述问题的原因,浏览器不支持多线程同时访问服务器只能同时发送一个请求,

       这样的访问方式为同步访问

    5) 要在文件上传的同时在iframe中实现进度访问,就需要ie浏览器与服务器进行异步交互

       此时就需要 XMLHttpRequest 对象

       javascript中可以直接使用XMLHttpRequest 对象与服务器进行异步通信

       获得XmlHttpRequest 对象的方式有两种

       ie7以上版本

       var xhr = null;

       if(window.XMLHttpRequest)

           xhr = new XMLHttpRequest();

       ie7以下版本

       if(window.ActiveXObject)

           xhr = new ActiveXObject(“Microsoft.XMLHTTP”);

      

       获得对象后需要调用open方法输入请求地址

       注意请求方式, 地址的输入, 并且需要设置为true 指定异步访问该地址

       xhr.open(“get”,”/upload/servlet/UploadServlet”, false)

      

       // 调用send 方法发送请求,post方式需要发送消息体,get方式则不用直接传入null

       xhr.send(null);

      

       // 访问 responseText 属性获得 Servlet 回送的数据

       document.write(xhr.responseText);

 

四、 api方法

1. DiskFileItemFactory 对象

    设置缓冲区大小,字节为单位,默认为10K,一般不用修改

    factory.setSizeThreshold(1000);

    设置临时文件存放目录

    factory.setRepository(file);

 

2. ServletFileUpload 对象

    判断是否为文件上传表单

    boolean b = upload.isMultipartContent(request);

   解析request对象

   List<FileItem> list = upload.parseRequest(request);

   设置上传文件的最大值

    setFileSizeMax(long fileSizeMax)

    设置上传文件总量的最大值

    setSizeMax(long sizeMax)

    设置编码格式

    setHeaderEncoding(java.lang.String encoding)

    注册进度监听器

    setProgressListener(ProgressListener pListener)

 

3. FileItem 对象

    获得表单字段的属性名

    item.getFieldName();

    获得普通字段的值

    item.getString(charsetName)

    获得文件上传字段的文件名

    item.getName()

    获得文件上传的流

    item.getInputStream()

  

 

分享到:
评论
1 楼 debbykindom 2011-10-25  
好,王力宏

相关推荐

    华为OD机试D卷 - 在字符串中找出连续最长的数字串(含“+-”号) - 免费看解析和代码.html

    私信博主免费获取真题解析以及代码

    node-v6.11.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    23-22.渗透测试-敏感信息收集工具汇总.mp4

    23-22.渗透测试-敏感信息收集工具汇总.mp4

    ZCANPRO安装包ZCANPRO-Setup-V2.2.6(20230327)

    ZCANPRO安装包

    单片机外文翻译at89s52单片机单片机.doc

    单片机外文翻译at89s52单片机单片机.doc

    基于AT89S52单片机的数字温度计设计.doc

    基于AT89S52单片机的数字温度计设计.doc

    华为OD机试D卷 - 最长子字符串的长度(一)- 免费看解析和代码.html

    私信博主免费获取真题解析以及代码

    node-v6.12.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Screenshot_2024-05-10-20-21-01-857_com.chaoxing.mobile.jpg

    Screenshot_2024-05-10-20-21-01-857_com.chaoxing.mobile.jpg

    基于mvc设计的轻量级Android开发框架。.zip

    Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

    node-v4.4.7-linux-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v4.2.0-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于SimCity的城市规划(Android).zip

    Android是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的移动操作系统,主要应用于移动设备,如智能手机和平板电脑。该系统最初由安迪·鲁宾开发,后被Google公司收购并注资,随后与多家硬件制造商、软件开发商及电信营运商共同研发改良。 Android操作系统的特点包括: 开放源代码:Android系统采用开放源代码模式,允许开发者自由访问、修改和定制操作系统,这促进了技术的创新和发展,使得Android系统具有高度的灵活性和可定制性。 多任务处理:Android允许用户同时运行多个应用程序,并且可以轻松地在不同应用程序之间切换,提高了效率和便利性。 丰富的应用生态系统:Android系统拥有庞大的应用程序生态系统,用户可以从Google Play商店或其他第三方应用市场下载和安装各种各样的应用程序,满足各种需求。 可定制性:Android操作系统可以根据用户的个人喜好进行定制,用户可以更改主题、小部件和图标等,以使其界面更符合个人风格和偏好。 多种设备支持:Android操作系统可以运行在多种不同类型的设备上,包括手机、平板电脑、智能电视、汽车导航系统等。 此外,Android系统还有一些常见的问题,如应用崩溃、电池耗电过快、Wi-Fi连接问题、存储空间不足、更新问题等。针对这些问题,用户可以尝试一些基本的解决方法,如清除应用缓存和数据、降低屏幕亮度、关闭没有使用的连接和传感器、限制后台运行的应用、删除不需要的文件和应用等。 随着Android系统的不断发展,其功能和性能也在不断提升。例如,最新的Android版本引入了更多的安全性和隐私保护功能,以及更流畅的用户界面和更强大的性能。此外,Android系统也在不断探索新的应用场景,如智能家居、虚拟现实、人工智能等领域。 总之,Android系统是一种功能强大、灵活可定制、拥有丰富应用生态系统的移动操作系统,在全球范围内拥有广泛的用户基础。

    2024-2030中国防水和修复服务市场现状研究分析与发展前景预测报告.docx

    2024-2030中国防水和修复服务市场现状研究分析与发展前景预测报告

    node-v4.3.0-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    37-37.XSS跨站脚本攻击概念介绍.mp4

    37-37.XSS跨站脚本攻击概念介绍.mp4

    node-v4.4.0-sunos-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    51单片机课程设计-温度传感器

    51单片机课程设计-温度传感器

    node-v6.1.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v6.14.1-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics