Fork me on GitHub

SpringMVC 文件上传

注意:所有文章除特别说明外,转载请注明出处.

SpringMVC 文件上传

这里SpringMVC为文件上传提供最直接的支持,这种支持是由即插即用的MultipartResolve实现。

提示:我们在上传文件之前需要:

1.创建虚拟目录来保存文件,此虚拟目录会对应磁盘上的一个实际的目录,在实际中肯定有一个服务器专门存储资源,然后将该路径映射成一个虚拟目录,用来在程序中指定获取文件的路径

创建的方法:
1.在tomcat的配置文件中配置一下(server.xml)。

            <Context docBase="E:\BangjinHu\projects\upload\" path="/file" reloadable="true"/>

2.然后编写后台Controller方法

1.配置CommonsMultipartResolver
    SpringMVC配置文件配置支持文件上传类CommonsMultipartResolver
    //配置文件上传解析器
    //id名称必须是如此class名称后面的部分
    <bean id="multipartResolver" class="org.springframework.web.multipart.CommonsMultipartResolver">
        //配置文件上传解析器参数
        //上传文件的最大大小
        <property name="maxUploadSize" value="10240000"></property>
        //上传文件的编码
        <property name="defaultEncoding" value="utf-8"></property>
    </bean>


2.控制层controller程序

    提示:上传文件的逻辑是,首先判断有没有上传文件,如果已经上传了,那么对文件重命名然后写到磁盘中。如果没有上传文件,那么应该用原来的文件。

    @Controller
    public class UploadController {

        @Resource
        HttpServletRequest request;

        /**
         * @return  返回相对路径RelativePath
         */
        public String RelPath() {
            String path = request.getContextPath();
            return request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
        }

        /**
         * @return  返回服务器目录的真实路径
         */
        public String RealPath() {
            return request.getSession().getServletContext().getRealPath("/");
        }

        /**
         *  单文件上传
         * 
         * @param imageFile
         * @param request
         * @return
         */
        @RequestMapping("/singleUpload")    
        public String singleUpload(@RequestParam("imageFile") MultipartFile imageFile, HttpServletRequest request){

            //0.获取文件原来的名字
            String filename = imageFile.getOriginalFilename();

            //1.新建一个文件夹对象
            File dir = new File(RealPath()+"upload/");

            //2.检查路径下upload文件夹是否存在
            if(!dir.exists()){              
                dir.mkdirs();
            }

            System.out.println("文件上传到:"+RelPath()+"upload/"+ filename);

            //3.在文件夹下新建一个filename文件的文件对象,此处新建文件应该新建在确切的物理路径下
            File targetFile = new File(RealPath()+"upload/"+ filename);

            //4.判断真实路径下是否存在filename文件
            if(!targetFile.exists()){
                try {
                    //5.在真实路径下创建filename空文件
                    targetFile.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            try {
                //6.复制文件到真实路径下,这里的文件只是一个路径?
                imageFile.transferTo(targetFile);
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("真实路径:"+RealPath()+"upload/");
            System.out.println("相对路径:"+RelPath()+"upload/");

            //非安全目录下使用(可用)
            return "redirect:"+RelPath()+"upload/"+filename;   

            //重定向到真实地址(不可用)
            //return "redirect:"+RealPath()+"upload/"+filename;                 
            //return "redirect:http://localhost:8080/SpringMvcTest/upload/"+filename;
        }

    /**
     * 多文件上传
     * @param request
     * @return
     */
    @RequestMapping("/multiUpload")
    public String multiUpload(HttpServletRequest request){

        //1、将请求进行转义
        MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest)request;

        //2、获取同一表单提交过来的所有文件
        Map<String, MultipartFile> files = multipartHttpServletRequest.getFileMap();

        //3、在真实路径创建文件
        File dir = new File(RealPath()+"upload/");
        if(!dir.exists()) {
            dir.mkdirs();
        }

        //4、将上传的文件的相对地址保存在一个列表中(客户端只能请求服务器的相对地址)
        List<String> fileList = new ArrayList<String>();
        for(MultipartFile file : files.values()) { 

            //5、在服务器的绝对地址下新建文件,并将上传的文件复制过去,将相对路径保存进List列表中,服务器的相对路径和绝对路径是相互映射的,客户端只能请求相对路径
            File targetFile = new File(RealPath()+"upload/" + file.getOriginalFilename()); 
            if(!targetFile.exists()) {
                try {
                    targetFile.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }

                try {
                    file.transferTo(targetFile);
                    fileList.add(RelPath()+"upload/"+file.getOriginalFilename());
                } catch (IllegalStateException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }else{
                //文件如果存在直接访问
                fileList.add(RelPath()+"upload/"+file.getOriginalFilename());
            }
        }
        System.out.println(fileList);
        request.setAttribute("files", fileList);
        return "/WEB-INF/jsp/multiUploadResult.jsp";    
    }
}

图片上传

SpringMVC对多部件类型解析

1.首先需要在页面form表单中提交`enctype="multipart/form-data`的数据。
2.然后需要在springmvc.xml文件中对multipart类型的数据进行解析。

    <!-- 文件上传 -->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 设置上传文件的最大尺寸为5MB -->
        <property name="maxUploadSize">
            <value>5242880</value>
        </property>
    </bean>

3.在pom.xml中添加文件上传的依赖

    <!-- 文件上传 -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>

4.创建图片虚拟目录存储图片

    直接在tomcat的conf/server.xml文件中添加虚拟路径。

注意:在图片虚拟目录中,一定将图片目录分级创建(提高i/o性能),一般我们采用按日期(年、月、日)进行分级创建。

5.上传图片的前台实现

    <tr>
        <td>商品图片</td>
        <td>
            <c:if test="${items.pic !=null}">
                <img src="/pic/${items.pic}" width=100 height=100/>
                <br/>
            </c:if>
            <input type="file"  name="items_pic"/>
        </td>
    </tr>

6.上传图片的controller实现

    //这里表示修改图片的controller方法
    @RequestMapping("/editItemsSubmit")
    public String editItemsSubmit(
            Model model,
            HttpServletRequest request,
            Integer id,
            @ModelAttribute("items")
            @Validated(value = ValidGroup1.class)ItemsCustom itemsCustom,
            BindingResult bindingResult,
            MultipartFile items_pic
    )throws Exception {
     //原始名称
    String originalFilename = items_pic.getOriginalFilename();
    //上传图片
    if(items_pic!=null && originalFilename!=null && originalFilename.length()>0){

    //存储图片的物理路径
    String pic_path = "D:\\tmp\\";

    //新的图片名称
    String newFileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
    //新图片
    File newFile = new File(pic_path+newFileName);

    //将内存中的数据写入磁盘
    items_pic.transferTo(newFile);

    //将新图片名称写到itemsCustom中
    itemsCustom.setPic(newFileName);

}

本文标题:SpringMVC 文件上传

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 07:59:21

原始链接:http://bangjinhu.github.io/undefined/SpringMVC 文件上传/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.