zoukankan      html  css  js  c++  java
  • springmvc中文件上传下载

    SpringMVC实现文件的上传和下载
    相对于JavaWeb阶段我们使用过servlet实现文件上传和下载操作;而SpringMVC实现了对上传操作的直接支持,提供了multipart解析器。MultipartFile提供了一些对文件操作的方法,使得文件上传变得更简单。无论上传还是下载都是进行二进制流的转换,下面我们以案例的形式了解一下如何使用SpringMVC实现文件的上传操作。

    文件上传

    准备

    了解

    1. 文件上传我们首先要考虑的就是把文件上传到哪里?是上传到工程目录下,还是上传到本地磁盘中?
    2. 因为上传的文件一般都是二进制文件,所以我们需要通过某种方式对表单提交进行编码。通过将enctype设置为multipart/form-data,每个输入域都将作为POST请求的不同部分进行提交(默认提交的表单中数据存储格式是名字-值,显然是不适合类似文件上传那种二进制数据的)。
    3. Spring提供了对multipart数据的解析器CommonsMultipartResolverMultipartResolver接口的实现类),但是这个解析器是基于Apache Commons FileUpload技术的,所以需要commons-filrUpload.jar支持。

    配置

    除了我们之前使用的Spring以及SpringMVC的先关jar依赖包,还需要导入以下jar文件:

    <!--文件上传下载-->
    <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
    </dependency>
    <dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
    </dependency>
    在springmvc.xml中配置上传下载解析器
    <!--上传下载解析器-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="utf-8"></property>
    <property name="maxUploadSize" value="10485760"></property> <!--设置最大支持的上传文件大小 B-->
    </bean>
    前台代码示例:

     后台代码示例

     @RequestMapping("/insertMovie")
        @ResponseBody
        public Map<String,String> insertMovie(@RequestParam(value="file",required = false) MultipartFile file,
                                              Movie movie,
                                              HttpServletRequest request
                                              ){
            Map<String,String> ret = new HashMap<String,String>();
            Movie movie1 = movieServices.selectMovieByName(movie.getMovieCname());
            if (movie1!=null){
             ret.put("type","error");
             ret.put("msg","电影已经存在,请勿二次添加");
             return ret;
            }
            if (movie.getMovieDetail().length()>255){
                ret.put("type","error");
                ret.put("msg","电影详情文字过长,请简要说明");
                return ret;
            }
    
          if(file.getSize()>10485760){
              ret.put("type","error");
              ret.put("msg","文件大小不得大于10M");
               return ret;
          }
          String oldName = file.getOriginalFilename();
          String type = oldName.substring(oldName.lastIndexOf(".")+1,oldName.length());
          if (!"jpg,jpeg,gif,png".toUpperCase().contains(type.toUpperCase())){
              ret.put("type","error");
              ret.put("msg","请添加包含jpg,jpeg,gif,pang为后缀的图片");
              return ret;
          }
          //上传图片要存储的路径,电影海报路径为movies/电影名字/picture/图片
            String path = request.getSession().getServletContext().getRealPath("static/static/movies/"+movie.getMovieCname()+"/picture/");
            File target = new File(path);
            if (!target.exists()){
                target.mkdirs();
            }
    
          String newName = System.currentTimeMillis()+"."+type;
    
            try {
                file.transferTo(new File(target,newName));
            } catch (IOException e) {
                e.printStackTrace();
                ret.put("type","error");
                ret.put("msg","文件保存异常");
                return ret;
    
            }
            //电影海报的项目绝对路径
            movie.setMoviePicture("static/static/movies/"+movie.getMovieCname()+"/picture/"+newName);
            //默认添加时,将电影状态设置为1,代表热映
            movie.setMovieState(1);
            int i = movieServices.insertMovie(movie);
            if (i<0){
                ret.put("type","error");
                ret.put("msg","添加失败");
                return ret;
            }
    
            ret.put("type","success");
            ret.put("msg","添加成功");
    
            return ret;
    
        }
    View Code

     文件上传路径在tomcat目录下,不在当前目录下?

    这是一个坑,明明代码都一样,人家的在target目录里面就能找到上传的文件,为什么我的就没有?
    后来通过打印路径,发现我上传的文件跑到Tomcat的目录那里了。
    但是,我就是想让上传的文件跑到当前项目的target目录下。
    解决办法就是设置项目的部署方式为war exploded,如下图:


    本段参考链接:https://blog.csdn.net/Deep_rooted/article/details/103838696

  • 相关阅读:
    时间复杂度理解
    elementUI表单校验汇总
    严选促销中心价格计算体系的建设之路
    sqlserver日志文件太大解决方法
    数据分析的 5 种细分方法
    批处理记录电脑磁盘剩余容量并输出到txt中
    关于sqlserver收缩数据库(引起的问题、可以半途停止吗)
    Sql Server 数据库总是显示“正在恢复、恢复挂起”的解决办法
    数据库“xxx”的事务日志已满,原因为“LOG_BACKUP”
    数据库分库分表策略的具体实现方案
  • 原文地址:https://www.cnblogs.com/ghwq/p/12446660.html
Copyright © 2011-2022 走看看