SpringMVC -> 上传文件到服务器(commonsmultipartfile)

导包

1.servlet的高版本的包,如果你还加了低版本的,就把低版本的删除了,不然等会找不到某些方法的

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>

mvc.xml

1.这是固定的,不变的
2.类是commonsmultipartresolver
3.id必须是multipartResolver,一点都不能改,否则保证出错

    <!--文件上传配置-->
    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
          id="multipartResolver">
        <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
        <property name="defaultEncoding" value="utf-8"/>
        <!-- 上传文件大小上限,单位为字节(10485760=10M) -->
        <property name="maxUploadSize" value="10485760"/>
        <property name="maxInMemorySize" value="40960"/>
    </bean>

controller:方法一

1.getoriginalfilename():获取上传文件的名字
2.如果你没有上传东西,就重定向到原来的位置极速index.html
3.requset.getservletcontext.getrealpath:在服务器设置一个保存的位置
4.如果设置的位置目录不存在,就怎么造一个
5.开始传,输入输出io流创建,一顿输出
6.关闭流,重定向到主页,让你继续传

@Controller
public class FileController {
  //@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
  //批量上传CommonsMultipartFile则为数组即可
  @RequestMapping("/upload")
  public String fileUplaod(@RequestParam("file") CommonsMultipartFile file,
                           HttpServletRequest request) {
    //获取文件名 : file.getOriginalFilename();
    String originalFilename = file.getOriginalFilename();
    //如果文件名为空,直接回到首页!
    if ("".equals(originalFilename)) {
      return "redirect:/index.html";
    }
    //上传路径保存设置
    String realPath = request.getServletContext().getRealPath("/upload");
    File path = new File(realPath);
    //如果路径不存在,创建一个
    if (!path.exists()) {
      path.mkdirs();
    }
    //try-with-resources环绕,这样就不用手动关闭流了
    try {
      try (InputStream inputStream = file.getInputStream()) {
        try (FileOutputStream outputStream = new FileOutputStream(new File(path, originalFilename))) {
          //读取写出
          int len = 0;
          byte[] bytes = new byte[1024];
          while ((len = inputStream.read(bytes)) != -1) {
            outputStream.write(bytes, 0, len);
            outputStream.flush();
          }
        }
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
    return "redirect:/index.html";
  }
}

controller:方法二

1.一定要先判断是不是传了文件,不判断,下面就不会创建upload文件夹,就会报错
2.没有目录就创建一个目录upload,在满足1的条件下
3.file.transferTo:创建一个文件,file1是目录,getoriginalfilename是文件名字;目录/名字

@Controller
public class FileController2 {
  @RequestMapping("/upload2")
  public String fileUpload(@RequestParam("file") CommonsMultipartFile file,
                           HttpServletRequest request) {
    //获取文件名 : file.getOriginalFilename();
    String originalFilename = file.getOriginalFilename();
    //如果文件名为空,直接回到首页!不返回下面可能会创建一个文件,等会transferTo的时候识别不了位置
    if ("".equals(originalFilename)) {
      return "redirect:/index.html";
    }
    //上传路径保存设置
    String realPath = request.getServletContext().getRealPath("/upload");
    File file1 = new File(realPath);
    //没有就创建一个,创建的如果没有前面的if判断,就会创建一个空的目录,相当于没创建
    //那么如果第一次提交没有东西,创建一个等于没创建的文件夹,下次再提交一个真的文件的时候
    //就不会再执行if,因为已经识别存在了文件夹,下面就会出现找不到upload文件夹的错误
    if (!file1.exists()) {
      file1.mkdir();
    }
    try {
      //通过CommonsMultipartFile的方法直接写文件,file1的名字就是upload目录+/+上传文件名,合起来就是文件了
      //如果file1是"",就会创建一个名字是upload的文件和一个空的文件夹(等于没有)
      file.transferTo(new File(file1 + "/" + file.getOriginalFilename()));
    } catch (IOException e) {
      e.printStackTrace();
    }
    return "redirect:/index.html";
  }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值