使用浏览器向服务器上传文件其本质是打开了一个长连接并通过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. cocoapods:安装/更新Ruby环境教程

    简介 有时候在安装cocoapods时会产生如下错误 ERROR: Error installing cocoapods: activesupport requires Ruby version &g ...

  2. solr+mongo-connector+mongdb+tomcat集成

    话题:solr安装 一.下载solr 本例采用4.10.3版本. Solr所有版本下载地址:http://archive.apache.org/dist/lucene/solr/ 下载完成后,解压的目 ...

  3. Android自定义View之倒计时Countdown实现

    先看一下效果: 在点击OK键之后,开始倒计时. 实现步骤 1.新建Android工程"CountdownView" 2.自定义Drawable 自定义View并没有直接的用户交互, ...

  4. linux软连接和硬链接

    1.软连接(符号连接)创建方法(相当于windows的快捷方式) # ln -s 原文件 连接文件(最好使用绝对路径) 特点: 1.软连接文件是777的权限,而且很小很小: 2.可以跨分区(文件系统) ...

  5. 三级联动(在YII框架中)

    //三级联动 //数据库代码过多就不上传了 //视图 <div class="area">    <table class="table"&g ...

  6. Python 十进制转二进制代码实现

    def my_bin(num): la = [] if num < 0: return '-' + my_bin(abs(num)) while True: num, remainder = d ...

  7. Linear Algebra lecture7 note

    Computing the nullspace (Ax=0) Pivot variables-free variables Special solutions: rref( A)=R   rank o ...

  8. 使用subclass UIActivity的方案来分享图片

    IOS6开始, 系统提供了UIActivityViewController, 对图片,文字,url进行相关的操作. 对于缺乏UI设计师的开发来说, 使用它进行轻量级的分享是很好的选择. 最大的缺点是自 ...

  9. 【耐克】【Air Max90 气垫跑鞋】

    [max90 36-44] [加毛冬款 36-44] [黑白百搭款 36-44] [air max90 高帮 冬款 耐看百搭 36-44] [air max90 高帮 40-44] [Air Max9 ...

  10. 深度学习框架 Torch 7 问题笔记

    深度学习框架 Torch 7 问题笔记 1. 尝试第一个 CNN 的 torch版本, 代码如下: -- We now have 5 steps left to do in training our ...