JAVA语言之基于Servlet3.0的文件上传
吕益平 2018-05-10 来源 : 阅读 1219 评论 0

摘要:JAVA语言在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了。希望对大家今后的JAVA语言学习有所帮助。

基于Servlet3.0的文件上传

   在Servlet2.5中,我们要实现文件上传功能时,一般都需要借助第三方开源组件,例如Apache的commons-fileupload组件,在Servlet3.0中提供了对文件上传的原生支持,我们不需要借助任何第三方上传组件,直接使用Servlet3.0提供的API就能够实现文件上传功能了。

一、使用Servlet3.0提供的API实现文件上传

1 <%@ page="" language="java" pageencoding="UTF-8">

 2

 3

 4  

 5    

 6  

 7  

 8  

 9        


10            

11                 上传单个文件

12            

13            

14            <form action="${pageContext.request.contextPath}/UploadServlet"

15                 method="post" enctype="multipart/form-data">

16                 上传文件:

17                

18                

19                

20            

21        

22        



23        


24            

25                 上传多个文件

26            

27            

28            <form action="${pageContext.request.contextPath}/UploadServlet"

29                 method="post" enctype="multipart/form-data">

30                 上传文件:

31                

32                

33                 上传文件:

34                

35                

36                

37            

38        

39    

40

 

1.2、开发处理文件上传的Servlet

 

  1、使用注解@MultipartConfig将一个Servlet标识为支持文件上传。

 

  2、Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。

 

UploadServlet 代码如下:

1 package com.iotek.controller;

2

 3 import java.io.File;

 4 import java.io.IOException;

 5 import java.io.PrintWriter;

 6 import java.util.Collection;

 7

 8 import javax.servlet.ServletException;

 9 import javax.servlet.annotation.MultipartConfig;

10 import javax.servlet.annotation.WebServlet;

11 import javax.servlet.http.HttpServlet;

12 import javax.servlet.http.HttpServletRequest;

13 import javax.servlet.http.HttpServletResponse;

14 import javax.servlet.http.Part;

15

16 //使用@WebServlet配置UploadServlet的访问路径

17 @WebServlet(name="UploadServlet",urlPatterns="/UploadServlet")

18 //使用注解@MultipartConfig将一个Servlet标识为支持文件上传

19 @MultipartConfig//标识Servlet支持文件上传

20 public class UploadServlet extends HttpServlet {

21

22     public void doGet(HttpServletRequest request, HttpServletResponse response)

23             throws ServletException, IOException {

24              request.setCharacterEncoding("utf-8");

25             response.setCharacterEncoding("utf-8");

26             response.setContentType("text/html;charset=utf-8");

27             //存储路径

28             String savePath = request.getServletContext().getRealPath("/WEB-INF/uploadFile");

29             //获取上传的文件集合

30             Collectionparts = request.getParts();

31             //上传单个文件

32             if (parts.size()==1) {

33                  //Servlet3.0将multipart/form-data的POST请求封装成Part,通过Part对上传的文件进行操作。

34                 //Part part = parts[0];//从上传的文件集合中获取Part对象

35                 Part part = request.getPart("file");//通过表单file控件()的名字直接获取Part对象

36                 //Servlet3没有提供直接获取文件名的方法,需要从请求头中解析出来

37                 //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"

38                 String header = part.getHeader("content-disposition");

39                 //获取文件名

40                 String fileName = getFileName(header);

41                 //把文件写到指定路径

42                 part.write(savePath+File.separator+fileName);

43             }else {

44                 //一次性上传多个文件

45                 for (Part part : parts) {//循环处理上传的文件

46                     //获取请求头,请求头的格式:form-data; name="file"; filename="snmp4j--api.zip"

47                     String header = part.getHeader("content-disposition");

48                     //获取文件名

49                     String fileName = getFileName(header);

50                     //把文件写到指定路径

51                     part.write(savePath+File.separator+fileName);

52                 }

53             }

54             PrintWriter out = response.getWriter();

55             out.println("上传成功");

56             out.flush();

57             out.close();

58     }

59

60      /**

61      * 根据请求头解析出文件名

62      * 请求头的格式:火狐和google浏览器下:form-data; name="file"; filename="snmp4j--api.zip"

63      *                 IE浏览器下:form-data; name="file"; filename="E:\snmp4j--api.zip"

64      * @param header 请求头

65      * @return 文件名

66      */

67     public String getFileName(String header) {

68         /**

69          * String[] tempArr1 = header.split(";");代码执行完之后,在不同的浏览器下,tempArr1数组里面的内容稍有区别

70          * 火狐或者google浏览器下:tempArr1={form-data,name="file",filename="snmp4j--api.zip"}

71          * IE浏览器下:tempArr1={form-data,name="file",filename="E:\snmp4j--api.zip"}

72          */

73         String[] tempArr1 = header.split(";");

74         /**

75          *火狐或者google浏览器下:tempArr2={filename,"snmp4j--api.zip"}

76          *IE浏览器下:tempArr2={filename,"E:\snmp4j--api.zip"}

77          */

78         String[] tempArr2 = tempArr1[2].split("=");

79         //获取文件名,兼容各种浏览器的写法

80         String fileName = tempArr2[1].substring(tempArr2[1].lastIndexOf("\\")+1).replaceAll("\"", "");

81         return fileName;

82     }

83    

84     public void doPost(HttpServletRequest request, HttpServletResponse response)

85             throws ServletException, IOException {

86         this.doGet(request, response);

87     }

88 }

希望这篇文章可以帮助到你,总之同学们,it资讯尽在职坐标。

本文由 @职坐标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论
本文作者 联系TA

熟悉企业软件开发的产品设计及开发

  • 57
    文章
  • 12425
    人气
  • 85%
    受欢迎度

已有47人表明态度,85%喜欢该老师!

进入TA的空间
求职秘籍 直通车
  • 索取资料 索取资料 索取资料
  • 答疑解惑 答疑解惑 答疑解惑
  • 技术交流 技术交流 技术交流
  • 职业测评 职业测评 职业测评
  • 面试技巧 面试技巧 面试技巧
  • 高薪秘笈 高薪秘笈 高薪秘笈
TA的其他文章 更多>>
java语言实现栈的顺序存储与链式存储
经验技巧 100% 的用户喜欢
一天天都在说hadoop,到底什么才是hadoop呢?
经验技巧 57% 的用户喜欢
WEB前端之div css 层级
经验技巧 100% 的用户喜欢
WEB前端之div css 绝对定位
经验技巧 100% 的用户喜欢
Java语言之Java Socket NIO示例
经验技巧 67% 的用户喜欢
其他海同师资 更多>>
孔庆琦
孔庆琦 联系TA
对MVC模式和三层架构有深入的研究
周鸣君
周鸣君 联系TA
擅长Hadoop/Spark大数据技术
范佺菁
范佺菁 联系TA
擅长Java语言,只有合理的安排和管理时间你才能做得更多,行得更远!
金延鑫
金延鑫 联系TA
擅长与学生或家长及时有效沟通
程光淼
程光淼 联系TA
精通C、C++等语言、智能芯片开发
经验技巧30天热搜词 更多>>

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程