Java文件上传

一、文件上传介绍

1.   method请求必须为post

2.   enctype属性值必须为multipart/form-data

3.   input 类型为type="file" 

1.表单提交上传 





提交表单上传,会刷新界面,一般不推荐 ,建议使用Ajax异步提交文件上传信息。

2.AJAX提交上传


上传文件:

二、请求头分析 

multipart/form-data 是基于post方法来传递数据的,并且其请求内容格式为Content-Type: multipart/form-data,用来指定请求内容的数据编码格式。另外,该格式会生成一个boundary字符串来分割请求头与请求体。

Java文件上传_第1张图片

三、Java解析代码

1.自己解析流

request.getInputStream();可以看看这篇文章

解析request.getInputStream()http://t.csdn.cn/TCm7T

2.标准解析流

commons-fileupload.jar需要依赖commons-io.jar 这个包,所以两个包我们都要引入。

具体使用方法见如下代码:

<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.FileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.FileItem" %>
<%@ page import="java.util.List" %>
<%@ page import="java.io.File" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


<%
    //判断是否是多段数据(只有是多段数据才是文件上传)
    //多段数据返回true,否则返回false
    if (ServletFileUpload.isMultipartContent(request)) {
        //创建FileItemFactory工厂实现类
        FileItemFactory factory = new DiskFileItemFactory();
        //创建用于解析数据的工具类ServletFileUpload类
        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
        //设置编码格式,解决上传文件名乱码问题
        servletFileUpload.setHeaderEncoding("utf-8");
        try {
            //解析上传的数据,得到每一个表单项FileItem
            List list = servletFileUpload.parseRequest(request);
            //判断每个表单项是普通类型还是上传的文件
            for (FileItem item : list) {
                if (item.isFormField()) {
                    //普通表单项
                    out.println("表单项的name:" + item.getFieldName());
                    //使用UTF-8解析,防止乱码
                    out.println("表单项的value:" + item.getString("UTF-8"));
                } else {
                    //上传的文件
                    out.println("表单项的name:" + item.getFieldName());
                    out.println("上传的文件名为:" + item.getName());
                    //将此文件写到d盘根目录,如果FileItem对象中的主体内容是保存在某个临时文件中,该方法顺利完成后,临时文件有可能会被清除
                    item.write(new File("d:\\ceShi\\" + item.getName()));
                    //删除临时文件,尽管当FileItem对象被垃圾收集器收集时会自动清除临时文件,但及时调用delete方法可以更早的清除临时文件,释放系统存储资源。
                    item.delete();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

%>

返回结果:

你可能感兴趣的:(Java,java,servlet,开发语言)