使用浏览器向服务器上传文件其本质是打开了一个长连接并通过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. TYVJ 4354 多重背包二进制优化

    直接放代码了 #include <cstdio> #include <cstring> #include <algorithm> using namespace s ...

  2. PHP MVC

    学习一个框架之前,基本上我们都需要知道什么是mvc,即model-view-control,说白了就是数据控制以及页面的分离实现,mvc就 是这样应运而生的,mvc分为了三个层次,而且三个层次各司其职 ...

  3. RestfulApi地址命名特点

    get /orders 全部get /orders/{id} 根据id查找get /orders/{number} 根据编号查找get /orders/name/{name} 根据名称查找post / ...

  4. java验证码前台技术

    //下面是在前台jsp页面不用导工具的情况下制作的验证码的基本代码 $(function(){ //创建验证码 createCode(); jQuery.validator.addMethod( &q ...

  5. 白电迁移-Auto fdisk

    ============================== fdisk /dev/vdbnp 1 w fdisk -l cd / mkdir /data mkfs.ext4 /dev/vdb1 mo ...

  6. 2016-12-15 java开发工作中,尚未做的工作

    目前未涉及的工作内容: 1.将静态页导入工程,建成jsp文件.配置css.js.img文件.跳转路径 2.未用工具生成pojo dao service等源码文件 3.未签入自己写的代码 4.未搭建子系 ...

  7. python3.5学习笔记--一个简单的图片爬虫

    参考资料:http://v.qq.com/boke/page/q/g/t/q01713cvdgt.html 目的:爬取网站图片 实际上以上链接的视频中已经将整个过程说的非常明白了,稍微有点计算机基础的 ...

  8. 全景VR视频游戏外包公司:技术分享使用U3D+CB制作VR游戏

    随着Oculus宣布1月6日开启预售,2016年很可能成为VR游戏元年,但很多的调研显示,手游设备才是市场增长的关键,SuperData发布的报告显示,2016年全球VR游戏市场规模预计在51亿美元左 ...

  9. mybatis实战教程(mybatis in action)之十:mybatis SqlSessionSupport 的使用,构件DAO 层的应用

    前面的系列mybatis 文章,已经基本讲到了mybatis的操作,但都是基于mapper隐射操作的,在mybatis 3中这个mapper 接口貌似充当了以前在ibatis 2中的 DAO 层的作用 ...

  10. S5Time BCD码存储

    ,时基为1秒. 当使用S5TIME时,定义数值的范围为0~999,而且要指明使用的时基.时基指定了时间单位. S5TIME时基及相应的时间范围如下: 时基 BCD码 时间范围 10 ms 00 10 ...