ssm-之文件的上传

ssm之文件的上传

自己程序员一枚,还在做框架的不断整合,就ssm文件上传来说,网上已经有很多案例。在此仅作自己以后参考笔记,希望能帮到一部分处于还在整合框架的初级人员。
下面开始

1. 由于自己用的是Maven,第一步添加约束

 <!--文件的上传-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.1</version>
        </dependency>
        <!--apache的commons-fileupload 1.0以上的版本,必须添加commons-io-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.5</version>
        </dependency>

2. 在springmvc.xml中添加如下代码至于为什么添加,还要深入学习

<!--文件上传-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="defaultEncoding" value="UTF-8"></property>
        <!-- 设定文件上传的最大值5MB,5*1024*1024 -->
        <property name="maxUploadSize" value="5242880"></property>
        <!--resolveLazily属性启用是为了推迟文件解析,以便在UploadController 中捕获文件大小异常-->
        <property name="resolveLazily" value="true"/>
    </bean>
    <!--文件上传结束-->

3.在控制层添加用于上传文件请求的UploadController.java

import cn.jiangdoc.entity.Result;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
@Controller
public class UploadController {
    @RequestMapping(value = "/uploadFile",method=RequestMethod.POST )
    @ResponseBody
    public Result upload(MultipartFile file, HttpServletRequest request){
        //文件的扩展名
        String originalFilename = file.getOriginalFilename();
        String extName=originalFilename.substring(originalFilename.lastIndexOf(".")+1);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSS");
        String res = sdf.format(new Date());
        // 新文件名
        String newFileName = "sliver" + res + extName;
        // upload文件夹位置,webapp下
        String rootPath = request.getSession().getServletContext().getRealPath("upload/");
        //获取协议名+域名+端口号+项目名 = http+"://"+localhost+":"+8080+/booksystem
        String url= request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath();

        try{
            // 创建年月文件夹
            Calendar date = Calendar.getInstance();
            File dateDirs = new File(date.get(Calendar.YEAR) + File.separator + (date.get(Calendar.MONTH)+1));
            // 新文件
            File newFile = new File(rootPath + File.separator + dateDirs + File.separator + newFileName);
            // 判断目标文件所在目录是否存在
            if( !newFile.getParentFile().exists()) {
                // 如果目标文件所在的目录不存在,则创建父目录
                newFile.getParentFile().mkdirs();
            }
            // 将内存中的数据写入磁盘
            file.transferTo(newFile);
            // 完整的url
            String fileUrl = url+"/upload/"+ date.get(Calendar.YEAR) + "/" + (date.get(Calendar.MONTH)+1) + "/" + newFileName;
            return new Result(true,fileUrl);
        }catch(Exception e){
            e.printStackTrace();
            return new Result(false,"上传失败");
        }

    }
}

值得注意的是请求映射不能只是 /upload ,如果是,则spring会把你POST请求转成GET请求导致报错:org.springframework.web.multipart.MultipartException: The current request is not a multipart request
4.前台测试页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>file upload</title>
</head>
<body>
    <form action="./file/fileupload.do" method="post" enctype="multipart/form-data">
        <label>文件上传</label>
        <input type="file" name="file">
        <input type="submit" value="提交">
    </form>
</body>
</html>

需要注意的是有的form表单中的enctype=”multipart/form-data“必不可少,否则提交会报The current request is not a multipart request

下面就可以去测试了

本文到此结束:如有不足之处,请多加指正;

猜你喜欢

转载自blog.csdn.net/jiang18238032891/article/details/88364549