spring MVC上传附件

spring mvc为我们封装了十分简单的上传附件的方法,以下通过一个例子学习。

1.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>附件管理</title>
<!-- css文件 -->
<link rel="stylesheet" href="./static/bootstrap/css/bootstrap.min.css" />
<link rel="stylesheet"
    href="./static/bootstrap/css/bootstrap-theme.min.css">
<link rel="stylesheet" href="./static/css/OtherCss/upload.css">
<!-- js文件 -->
<script type="text/javascript" src="./static/js/jquery-1.11.0.js"></script>
<script type="text/javascript"
    src="./static/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="./static/js/OtherJs/upload.js"></script>
<!-- ajax form -->
<script type="text/javascript" src="./static/js/jquery.form.js"></script>
<script type="text/javascript" src="./static/js/ajaxfileupload.js"></script>
<script type="text/javascript"
    src="./static/js/jquery-migrate-1.2.1.min.js"></script>
<script type="text/javascript">
    var dialog = frameElement.dialog;
    $(function() {
        $("#submit1").click(function() {
            if ($("#categoryName").val() == "") {
                alert("请填写类别名称");
                return false;
            }
            var ajax_option = {
                url : "categoryAttSave",
                type : "post",
                dataType : "html",
                success : function(data) {
                    if (data == 1) {
                        alert("成功");
                    } else {
                        alert("失败")
                    }
                    dialogClose();
                }
            }
            $("#thisForm").ajaxSubmit(ajax_option);
        });
    });

    //返回
    function dialogClose() {
        parent.g.loadData(parent.g.parms);
        dialog.close();//关闭dialog
    }
</script>
</head>
<body>
    <form id="thisForm" method="post" action="categoryAttSave"
        enctype="multipart/form-data">
        <input type="hidden" name="categoryId" value="${category.categoryId}" />
        <div class="container-fluid ">
            <div class="col-xs-12">
                <div class="panel-body ">
                    <div class="row">
                        <div class="col-xs-8 col-xs-offset-1 tipinfo"
                            style="padding-bottom: 10px">
                            <div class="input-group">
                                <h3>${category.categoryName}</h3>
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-xs-8 col-xs-offset-1 tipinfo"
                            style="padding-bottom: 10px">
                            <div class="info_center" id="userface_x">
                                <div class="upload_face">
                                    <div class="upload_btn">
                                        <a type="button" class="upload_vl" id="upface_tt">选择您要上传的图片</a>
                                        <p id="img_rq">仅支持JPG、GIF、PNG、JPEG、BMP格式,文件小于4M</p>
                                    </div>
                                    <div class="upface_img">
                                        <c:choose>
                                            <c:when test="${not empty category.categoryPic}">
                                                <img id="preview" src="./${category.categoryPic}" />
                                            </c:when>
                                            <c:otherwise><img id="preview" src="./static/img/nopic.png" /></c:otherwise>

                                        </c:choose>
                                    </div>
                                    <div class="changeimg" style="display: none">
                                        <input id="fileimg" type="file" name="upload" />
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-xs-5  col-xs-offset-5">
                            <button type="button" class="btn btn-default " onClick="dialogClose();">关闭</button>
                            <button type="button" class="btn btn-primary " id="submit1">
                                提交</button>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </form>
</body>
</html>

主要要注意的是form的地方必须加 enctype="multipart/form-data"这句话,还有就是<input id="fileimg" type="file" name="upload" />这句话。本实例用了一个js的上传插件。只是优化了上传的体验,不涉及到原理,所以此处不介绍相关内容。主要还是介绍如何实现上传。

2.后台代码

controller

    @ResponseBody
    @RequestMapping("categoryAttSave")
    public String categoryAttSave(HttpServletRequest req, MultipartFile upload,
            int categoryId) {
        Integer result = categoryService.categoryAttSave(req, upload,
                categoryId, uploadFile);
        return result.toString();
    }

Service

/**
     * 附件上传并修改数据库
     *
     * @param req
     * @param upload
     * @param categoryId
     * @param uploadFile
     * @return
     */
    public int categoryAttSave(HttpServletRequest req, MultipartFile upload,
            int categoryId, String uploadFile) {
        int result = 0;
        String originalFileName = upload.getOriginalFilename();
        String suffix = IOUtil.getFileSuffix(originalFileName);
        String fileName = RandomUtil.getTimeStampPlusRand() + "." + suffix;
        String realPath = req.getServletContext().getRealPath(uploadFile);
        try {
            upload.transferTo(new File(realPath + "/" + fileName));
            // 数据库操作
            TCategory category = baseDao.getT(
                    "TCategoryMapper.selectByPrimaryKey", categoryId);
            String oldCategoryPic = category.getCategoryPic();
            category.setCategoryPic(uploadFile + "/" + fileName);
            baseDao.updateT("TCategoryMapper.updateCategoryPic", category);
            // 删除原来的图片
            IOUtil.deleteFile(req, oldCategoryPic);
            result = 1;
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return result;
    }

其实主要是注意到传递过来的MultipartFile 名称,要与jsp里面的file名对应。还有就是我们需要用到request来获取附件最终存储的位置,所以传递了一个HttpServletRequest。上传就是这句话upload.transferTo(new File(realPath + "/" + fileName));很简单吧,如果我们自己写的话,就要通过输入流写入到file里了。而spring mvc只要一句简单的代码就实现了。

PS:上述代码还是有弊端的,当我们没有选定需要上传的图片而点击了上传的时候,它会报如下错误。

org.springframework.web.multipart.MultipartException: The current request is not a multipart request

大概意思就是,你这个请求并不是关于文件上传的请求。这是spring 替你检查了并直接报运行错误。

我们可以通过修改controller代码,替代spring 的检查,就可以规避这个错误了。

    @ResponseBody
    @RequestMapping("categoryAttSave")
    public String categoryAttSave(HttpServletRequest req, int categoryId) {
        MultipartFile upload = null;
        if (req instanceof MultipartHttpServletRequest) {
            upload = ((MultipartHttpServletRequest) req).getFile("upload");
        }
        Integer result = categoryService.categoryAttSave(req, upload, categoryId,
                uploadFile);
        return result.toString();
    }

上述代码我们自己检查是不是关于文件上传的请求,就不会报错了。

时间: 2024-11-13 21:18:51

spring MVC上传附件的相关文章

spring - mvc 上传与下载

参照了网上相关代码 注意事项: 1 springmvc.xml必须配置: Java代码   <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:defaultEncoding="utf-8"/> <bean id="multipartResolver"

怎样解决asp.net.mvc上传附件超过长度问题?

最近,在做一个上传附件功能,但是文件超过4M,就报上传的文件超过长度问题 如何解决这个问题呢?这里我找了一下资料,了解一下问题所在,有3种解决方法 方案一:在所在项目的web.config配置文件中,修改maxRequestLength的值 方案二:在.net framework的安装目录下的machine.config配置文件,修改maxRequestLength的值 方案三:修改IIS服务的上传文件大小的限制 方案一: 1.修改web.config文件,改变这个maxRequestLengt

spring mvc上传文件的简单例子总结及注意事项

1.创建maven项目         在pom.xml里面引入该依赖的jar包,pom.xm的代码如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven

Spring Mvc 上传文件Demo 实例

返得利购物. 淘宝.京东500家商城合作,包括全面的商城返利网.注冊就送5元,购物就有返利.随时提现. 同学们,新一轮的返利大潮正在慢慢靠近,让购物都认为自己在赚钱.购物,机票.游戏.酒店旅游,地方特色,娱乐,尽在www.bbuy8.com让你购物省钱,省心.[群号:335156195] Controller 类 package com.upload.action; import java.io.File; import java.io.FileOutputStream; import java

Spring MVC上传文件

1.applicationContext.xml 1 <bean id="multipartResolver" 2 class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 3 <property name="maxUploadSize" value="104857600" /> 4 <property

spring mvc上传下载文件

前端jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName(

Spring MVC 上传、下载、显示图片

通过这篇文章你可以了解到: 使用 SpringMVC 框架,上传图片,并将上传的图片保存到文件系统,并将图片路径持久化到数据库 在 JSP 页面上实现显示图片.下载图片 [TOC] 1. 准备工作 首先我们需要准备好开发环境,本文测试环境是 SSM(Spring 4.3.9 + SpringMVC 4.3.9 + MyBatis 3.4.4) ,数据库为 MySQL 5.5,数据库连接池 C3P0 0.9.5.2,构建包 Maven 3.5.0,Tomcat 8.5. 限于篇幅原因,关于 SSM

spring mvc上传文件服务器配置

在使用springMVC进行系统实现时,springMVC默认的解析器里面是没有加入对文件上传的解析的.但如果你想使用springMVC对文件上传的解析器来处理文件上传的时候就需要在spring的applicationContext里面加上springMVC提供的MultipartResolver的申明.客户端每次进行请求的时候,springMVC都会检查request里面是否包含多媒体信息,如果包含了就会使用MultipartResolver进行解析,springMVC会使用一个支持文件处理的

spring mvc 上传文件

springmvc 上传文件步骤: 第一 拷贝所需jar 第二 需要在springmvc(springmvc-servlet.xml)中配置:SpringMVC上传文件时,需要配置MultipartResolver处理器 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">         <p