Springmvc的几种多附件上传方式

本文介绍了在springmvc中实现上传功能的三种方式,下面介绍代码部分:

前台Jsp:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form id="itemForm"
        action="${pageContext.request.contextPath }/product/add3.do"
        method="post" enctype="multipart/form-data">
        <table width="100%" border="0">
            <tr>
                <td width="200px">姓名:</td>
                <td><input type="text" name="name"></td>
            </tr>
            <tr>
                <td><input type='file' name='myfiles' /></td>
                <td><input type='file' name='myfiles' /><font color="red">请上传图片的大小不超过3MB</font></td>
            </tr>
            <tr>
                <td colspan="2" align="left"><input type="submit" value="提交" /></td>
            </tr>
        </table>
    </form>

</body>
</html>

配置文件applicationContext.xml:

<!-- 文件的上传 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置编码格式,默认为iso-8859-1 -->
        <property name="defaultEncoding" value="utf-8" />
        <!-- 为了测试时速,指定所上传文件的总大小不能超过1GB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
        <property name="maxUploadSize" value="1073741824" />
    </bean>

后台Controller:
第一种方式:

    /*
     * 通过IO流的方式上传文件
     * @RequestParam("myfiles") 将name=myfiles控件得到的文件封装成MultipartFile数组对象
     */

    @RequestMapping("add1")
    public String add1(@RequestParam("myfiles") MultipartFile[] myfiles,
            HttpServletRequest request)
            throws IllegalStateException, IOException {
        // 记录开始时间
        long startTime = System.currentTimeMillis();
        for (MultipartFile file : myfiles) {
            if (file.isEmpty()) {
                //此文件域未进行上传
            } else {
                //设置文件路径
                String realPath = request.getServletContext()
                        .getRealPath("update1");
                //如果文件夹不存在,创建新的文件夹
                File upload_dir = new File(realPath);
                if (!upload_dir.isDirectory() && !upload_dir.isFile()) {
                    upload_dir.mkdir();
                    System.out.println("文件夹创建成功");
                }
                //获取输出流, 文件名改为为当前时间+原始文件名.扩展名
                OutputStream outputStream = new FileOutputStream(realPath + "/"
                        + new Date().getTime() + file.getOriginalFilename());
                //利用MultipartFile中.getInputStream()方法获取输入流
                InputStream inputStream = file.getInputStream();
                //读取并写入
                int temp = 0;
                byte[] by = new byte[1024];
                while ((temp = inputStream.read(by)) != -1) {
                    outputStream.write(by, 0, temp);
                }

                //回收资源
                inputStream.close();
                outputStream.close();

            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("第一种方式的运行时间:" + String.valueOf(endTime - startTime)
                + "ms");
        return "redirect:list.do";
    }

第二种方式:

    /*
     * 利用MultipartFile中的transferTo()方法进行上传
     */
    @RequestMapping("add2")
    public String add2(@RequestParam("myfiles") MultipartFile[] myfiles,
            HttpServletRequest request)
            throws IllegalStateException, IOException {
        long startTime = System.currentTimeMillis();
        for (MultipartFile file : myfiles) {
            if (file.isEmpty()) {
                //此文件域未进行上传
            } else {
                //设置文件路径
                String realPath = request.getSession().getServletContext()
                        .getRealPath("/update2");
                //如果文件夹不存在,创建新的文件夹
                File upload_dir = new File(realPath);
                if (!upload_dir.isDirectory() && !upload_dir.isFile()) {
                    upload_dir.mkdir();
                    System.out.println("文件夹创建成功");
                }
                // 把文件上传至path的路径,文件名改为为当前时间+原始文件名.扩展名
                File localFile = new File(realPath + "/" + new Date().getTime()
                        + file.getOriginalFilename());
                file.transferTo(localFile);
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("第二种方式的运行时间:" + String.valueOf(endTime - startTime)
                + "ms");
        return "redirect:list.do";
    }

第三种方式:

    /*
     * 利用spring提供的上传方法
     */
    @RequestMapping("add3")
    public String add3(HttpServletRequest request)
            throws IllegalStateException, IOException {
        long startTime = System.currentTimeMillis();
        // 创建CommonsMultipartResolver对象
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(
                request.getSession().getServletContext());
        // 检查form中是否有enctype="multipart/form-data"
        if (multipartResolver.isMultipart(request)) {
            // 设置文件路径
            String realPath = request.getSession().getServletContext()
                    .getRealPath("/update3");
            // 如果文件夹不存在,创建新的文件夹
            File upload_dir = new File(realPath);
            if (!upload_dir.isDirectory() && !upload_dir.isFile()) {
                upload_dir.mkdir();
                System.out.println("文件夹创建成功");
            }
            // 将request变成MultipartHttpServletRequest
            MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request;
            // 通过multiRequest获取MultipartFile对象集合
            List<MultipartFile> files = multiRequest.getFiles("myfiles");
            for (MultipartFile file : files) {
                if (file.getSize() != 0) {
                    // 把文件上传至path的路径,文件名改为为当前时间+原始文件名.扩展名
                    File localFile = new File(realPath + "/" + new Date().getTime()
                            + file.getOriginalFilename());
                    file.transferTo(localFile);
                }
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("第三种方式的运行时间:" + String.valueOf(endTime - startTime)
                + "ms");
        return "redirect:list.do";
    }

现在分别对三种方式进行测试
一、上传两个文档,总大小为1.81MB
这里写图片描述
运行结果:
这里写图片描述

二、上传一个视频,总大小为964 MB
这里写图片描述
运行结果:
这里写图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值