使用浏览器向服务器上传文件其本质是打开了一个长连接并通过TCP方式传输数据。而需要的动作是客户端在表单中使用file域,并指定该file域的name值,然后在form中设定enctype的值为multipart/form-data和method值为post。其他就如同一般表单一样。示例如下:

<form name="form" action="uploadbyservlet1" enctype="multipart/form-data" method="post">
            上传文件<input type="file" name="file"/><br>
            <button type="submit">上传</button>

</form>

而服务端接受到的表单数据示例如下:
------WebKitFormBoundaryHn0SIY7N2MBTtS5n
Content-Disposition: form-data; name="file"; filename="自我之歌.txt"
Content-Type: text/plain
 
我的世界只有那么一天
起于今天的晨曦
终于明天的黎明
烦恼的终将被阳光照淡
欢喜的也将岁黑夜散去
体验的同时愿将过去遗忘
遗忘的同时也将寄予明天
------WebKitFormBoundaryHn0SIY7N2MBTtS5n--   
其中“------WebKitFormBoundaryHn0SIY7N2MBTtS5n--  ”是类似于分隔符这样的作用,在其中描述了相关的所有信息,如文件名、file域名称、文件类型和文件内容。而当有多个file域上传文件时,表单内容是用分隔符将不同file域的内容分割开。因此使用servlet上传文件要解决的问题就是如何从表单数据中提取对应文件的文件名、类型和内容。因此便有如下解决方法:
1. 如果是文本文件,因为内容的标识是明显的,所以可以按行读取的方式找到文件名和文件内容,然后写入文件;
2. 如果是二进制文件,则可以使用1中的方式找到文件内容的位置,然后使用BufferedInputStream这样的可以进行skip跳读的流来封装输入流,找到内容数据位置后,使用skip来调到该位置,从而读取内容数据
而上面这些都是Sevler3之前的操作方式,可以看出来需要处理很多重复的步骤。而使用Servlet3就可以节省很多功夫。Servlet3中将上传文件封装在一个Part对象中,一个文件域对应一个Part,可以通过request.getParts()来获得所有的Part,在Part中通过getHeader("content-disposition")  可以获得上传文件的信息,从中提取出文件名。然后使用Part.write方法将文件保存在本地。但这只能在Servlet3下使用,而且必须给Servlet添加@MultipartConfig才可以使用Part来保存文件。

使用Servlet上传文件的更多相关文章

  1. Servlet上传文件

    Servlet上传文件 1.准备工作 (1)利用FileUpload组件上传文件,须要到apache上下载commons-fileupload-1.3.1.jar 下载地址:http://common ...

  2. 原生Servlet 上传文件

    依赖jar <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons ...

  3. java servlet上传文件并把文件内容显示在网页中

    servlet3.0(JDK1.6)自带的API即可实现本地文件的上传,Servlet3.0新增了Part接口,HttpServletRequest的getPart()方法取得Part实现对象.下面我 ...

  4. servlet上传文件报错(三)

    1.具体报错如下 null null Exception in thread "http-apr-8686-exec-5" java.lang.OutOfMemoryError: ...

  5. 5.servlet 上传文件

    一.maven依赖 <dependency> <groupId>commons-fileupload</groupId> <artifactId>com ...

  6. JSP && Servlet | 上传文件

    在WebContent下新建index.jsp 要点: 1.  表单 method 属性应该设置为 POST 方法,不能使用 GET 方法. 2.  表单 enctype 属性应该设置为 multip ...

  7. J2EE:Servlet上传文件到服务器,并相应显示

    Servlet 可以与HTML一起使用来允许用户上传文件到服务器 编辑上传文件的页面upload.html 注意事项:上传方式使用POST不能使用GET(GET不能上传文件) 表单 enctype 属 ...

  8. servlet上传文件报错(二)

    1.具体报错如下: java.io.FileNotFoundException: D:\MyEclipse\workspace\FileUpload\WebRoot\upload (拒绝访问.) at ...

  9. JAVA servlet 上传文件(commons-fileupload, commons-io)

    <1>获取二进制文件流并输出 InputStream inputStream = request.getInputStream(); BufferedReader reader = new ...

随机推荐

  1. Swift—泛型(上)

    1.泛型 泛型是一种非常灵活的语法,允许程序在函数.枚举.结构体.类中定义类型形参,这种类型形参实际代表的类型是动态改变的——程序可以等到真正使用这些函数.枚举.结构体.类时才为这些类型形参传入实际的 ...

  2. css的学习

    第一天. css 1.知道 内联 内部 外部 的优先权 2.css的语法 3.id 选择器 以及 类选择器 和属性选择器 4.对图片  长 宽 的编辑  调整图片 5.通过内部 对整个页面 文字  颜 ...

  3. 网页中插入视频(object)

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://down ...

  4. {part1}DFN+LOW(tarjan)割点

    什么是jarjan? 1)求割点 定义:在无向连通图中,如果去掉一个点/边,剩下的点之间不连通,那么这个点/边就被称为割点/边(或割顶/桥). 意义:由于割点和割边涉及到图的连通性,所以快速地求出割点 ...

  5. 获取应用程序信息.h

    ////  获取应用程序信息.h//  IOS笔记// 一般会用来判断是否有新版本.是否需要强制更新 iOS的版本号,一个叫做Version,一个叫做Build,这两个值都可以在Xcode 中选中ta ...

  6. FPGA书籍

    Xilinx FPGA开发实用教程(第2版) 徐文波,田耘 著

  7. 访问者模式(Visitor Pattern)

    定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. Visitor 抽象访问者角色:为该对象结构中具体元素角色声明一个访问操作接口.该操作接口 ...

  8. phpstorm 配置 babel 支持EcmaScript6

    1.安装nodejs 2.npm install --save-dev babel-cli 3.npm install babel-preset-es2015 --save-dev 4.phpstor ...

  9. sqlalchemy数据模型

    sqlalchemy在python里作为orm还是比较有名气的,以下是建立的几个简单模型,完全可和flask的数据持久层分离. # coding: utf8 from sqlalchemy impor ...

  10. oracle中TO_CHAR与TO_DATE

    TO_CHAR 是把日期或数字转换为字符串TO_DATE 是把字符串转换为数据库中得日期类型转换函数 TO_DATE格式(以时间:2016-07-25   11:45:25为例) Year: yy t ...