>>分享Java Web开发技术,并且对孙卫琴的《Tomcat与Java Web开发技术详解》提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 30213 个阅读者 刷新本主题
 * 贴子主题:  用Servlet API中的Part接口实现文件上传 回复文章 点赞(0)  收藏  
作者:flysky    发表时间:2018-09-12 06:17:38     消息  查看  搜索  好友  邮件  复制  引用

1、Servlet 3.0 对文件上传的支持
Servlet 3.0 改进了部分API,使得java web 的开发进一步得到简化。
其中两个较大的改进是:

HttpServletRequest 增加了对文件上传的支持
ServletContext 允许通过编程的方式动态注册Servlet、Filter
HttpServletRequest 提供了如下两个方法来处理文件上传 :

Part getPart(String name) : 根据文件上传域name属性来获取上传文件。
Collection< Part > getParts() :获取所有的文件上传域。
官方文档对这两个方法的说明为:
这里写图片描述
这里写图片描述

上面两个方法的返回值都涉及一个API :Part ;每个Part对象对应于一个文件上传域,该对象提供了大量方法来访问上传的文件,如文件类型、大小等。并提供了一个write(String name)将文件写入服务器硬盘。

上传文件表单 :
为了向服务器上传文件,需要在表单里使用 < input type=”file” name=”xxx” …./>文件域,这个文件域会在HTML页面生成一个单行文本框和一个用于“浏览文件”的button。除此之外,表单必须设置enctype属性
enctype属性指定的是表单数据的编码方式,该属性有如下三个值:

application/x-www-form-urlencoded :这是默认的编码方式,他只处理表单域里的value属性值,采用这种编码方式的表单会将表单域的值处理成URL编码方式
multipart/form-data : 这种方式会以二进制流的方式来处理表单数据,这种编码方式会把 文件域指定文件的内容 (并不是原文件,而是文件内容)也封装到请求参数里
text/plain : 这种编码方式当表单的action 属性为 mailto:URL 时比较方便,主要用于直接通过表单发送邮件
如果将enctype设置为 application/x-www-form-urlencoded ,或者不设置enctype属性,提交表单时只会发送文件域文本框里的字符串,也就是浏览者所选择文件的绝对路径。这对服务器来说没多大用处,毕竟服务器又无法访问客户机的文件系统。

Servlet实现文件上传代码:
使用Servlet实现文件上传非常简单,不需要commons-fileupload 等工具。注意导入servlet-api.jar
表单示例:

    <form action="upload" method="post" enctype="multipart/form-data">
      <input type="file" name="file">
      <input type="submit" value="submit">
    </form>

Servlet示例:

/**@MultipartConfig
* 不指定location属性时,在IDEA环境下,part.write(fileName);上传文件默认保存到以下地址
*      C:\Users\Windward\.IntelliJIdea2017.1\system\tomcat\index_jsp_upLoad\work\Catalina\localhost\ROOT下
* 指定location属性,需要手动创建文件夹
* 1.相对路径时:如 location = "/uploadFiles"
*  保存地址为:E:\apache-tomcat-8.0.24\work\Catalina\localhost\upLoad_war_exploded\uploadFiles
* 2.绝对路径时:如 location = "F:\\uploadFiles"
*  保存至绝对路径下,如 F:\uploadFiles下
*
*/
@javax.servlet.annotation.MultipartConfig(location = "F:\\uploadFiles")
@javax.servlet.annotation.WebServlet(name = "upload",urlPatterns={"/upload"})
public class UploadServlet extends javax.servlet.http.HttpServlet {
    protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {

        //设置请求的编码方式
        request.setCharacterEncoding("utf-8");
        //设置响应内容,与编码
        response.setContentType("text/html;charset=utf-8");
        //获取输出流,输出到客户端浏览器
        PrintWriter out = response.getWriter();
        //获取文件上传域 "file"域,Part对象封装了获取的文件
        Part part = request.getPart("file");
        //获取文件类型
        String fileType = part.getContentType();
        //获取文件大小
        Long size= part.getSize();
        //获取文件上传域的所有headerName
        Collection<String> headerNames = part.getHeaderNames();
        //获取包含原始文件名的字符串
        String fileNameInfo = part.getHeader("content-disposition");
        //提取上传文件的原始文件名
        String fileName = fileNameInfo.substring(fileNameInfo.indexOf("filename=")+10,
                                                    fileNameInfo.length()-1);
       //将文件写入服务器硬盘,存入的文件名为fileName(write的参数),
        // 路径为@MultipartConfig(location = "/uploadFiles")location属性值
        part.write(fileName);

        out.println("<html>");
        out.println("<body>");
        out.print("文件名:"+fileName+"<br/>");
        out.print("文件类型:"+fileType+"<br/>");
        out.print("文件大小(byte):"+size+"<br/>");
        //遍历打印文件上传域的所有 HeaderName-Value
        for (String headerName: headerNames ) {
            out.print("------------------------------------------------------------------"+"<br/>");
            out.print("headerName :"+headerName+"<br/>");
            //输出headerName对应的value值
            out.print("value:"+part.getHeader(headerName) +"<br/>");
            out.print("------------------------------------------------------------------"+"<br/>");
        }
        out.println("</body>");
        out.println("</html>");
        out.close();

    }

    protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException {
        doPost(request,response);
    }
}


程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->Swing组件(下)
  JavaWeb开发-->JavaWeb应用入门(Ⅱ)
  JSP与Hibernate开发-->持久化层的映射类型
  Java网络编程-->XML数据处理
  精通Spring-->
  Vue3开发-->组合(Composition)API
  统计网站访问次数的过滤器
  设置请求数据的字符编码的过滤器
  做前后端分离项目前必须要知道的事
  在Java Web应用中获取绝对路径和相对路径
  JSP 调试 技巧
  JSP 自动刷新
  JSP HTTP 状态码
  在JSP中如何取得form表单中被选中的radio项的值
  配置简单的嵌入式tomcat和jetty
  JSP实现分页展示MySQL数据库中的数据
  JSP 到数据库查询的数据 分页显示
  web.xml中配置出错页面,处理异常
  Tomcat的各个版本比较
  HTML5 简介
  mysql ON DUPLICATE KEY UPDATE 引起自增ID变化的解决办法
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。