使用浏览器向服务器上传文件其本质是打开了一个长连接并通过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. mysql 操作用户权限

    使用可以对mysql数据库用户表有操作权限的用户名登陆mysqlinsert into user(Host,User,Password) values('%','name','password');如 ...

  2. java批量insert入mysql数据库

    mysql 批量insert语句为 insert into Table_(col1,col2...) values(val11,val12...),(val11,val12...),...; java ...

  3. 【转载】ANSYS完全法与模态叠加法瞬态分析实例

    原文地址:http://www.caetecc.com/thread-2172-1-1.html ! 半脉冲载荷 --- 模态叠加法fini/clear,nostart/PREP7ET,1,BEAM4 ...

  4. 关于SQL Cookbook里dept与emp表结构以及数据

    用MYSQL 写了一下,将number变成int, to_date去掉即可. DROP TABLE IF EXISTS `dept`; CREATE TABLE `dept` ( `DEPTNO` ) ...

  5. NOIp 2011 mayan游戏 搜索

    题目描述 Mayan puzzle是最近流行起来的一个游戏.游戏界面是一个 7 行5 列的棋盘,上面堆放着一些方块,方块不能悬空堆放,即方块必须放在最下面一行,或者放在其他方块之上.游戏通关是指在规定 ...

  6. redis之(二十一)redis之深入理解Spring Redis的使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

  7. WebService 不依赖配置文件直接在构造函数配置地址

    研究了下 ClientBase(Binding binding, EndpointAddress remoteAddress) 这个重载更好用,都不用填名称比如 new PAS.WebService. ...

  8. 首页使用page类完成生成页面内容的大部分工作

    fs2在处理异常及资源使用安全方面也有比较大的改善.fs2 Stream可以有几种方式自行引发异常:直接以函数式方式用fail来引发异常.在纯代码里隐式引发异常或者在运算中引发异常,最开始只是我自己浏 ...

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

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

  10. cookie 和session 的区别:

    1.cookie数据存放在客户的浏览器上,session数据放在服务器上.2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session.3. ...