Java文件上传

一、文件上传介绍

1.   method请求必须为post

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

3.   input 类型为type="file" 

1.表单提交上传 

<form action="/aaa/fileUpload.jsp" enctype="multipart/form-data" method="post">
    <input type="text" name="username">
    <br><br>
    <input type="file" name="fileData">
    <br><br>
    <button type="submit">提交文件</button>
</form>

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

2.AJAX提交上传

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
<div>
    上传文件: <input type="file" onchange="uploadFile(this)">
</div>
<script>
    function uploadFile(event) {
        var File = event.files[0];
        var formData = new FormData();
        formData.append("username", "测试账号123")
        formData.append("file", File)
        $.ajax({
            url: '/aaa/fileUpload.jsp',
            type: 'post',
            data: formData,
            contentType: false,
            processData: false,
            success: function (result) {
                console.log(result)
            },
            error: function (err) {
                console.log(err)
            }
        });
    }
</script>

二、请求头分析 

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

三、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<FileItem> 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();
        }
    }

%>

返回结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值