Java-文件上传

简介

文件上传,是指将本地的图片,视频,音频等文件上传到服务器,提供其他用户浏览或者下载的过程。

文件上传

前端页面三要素

  • 前端要想上传文件必须要定义一个form表单
  • 表单项:file,这样在前端点击这个按钮时就会弹出上传文件对话框
  • 表单的提交方式必须得是post方式,上传文件可能会比较大所以使用post提交方式
  • 我们需要将enctype属性设置编码格式为:“multipart/form-data”,如果设置enctype属性,则只是提交文件名
<form action="/upload" method="post" enctype="multipart/form-data">
    姓名:<input type="text" name="username"><br>
    年龄:<input type="text" name="age"><br>
    头像:<input type="file" name="file"><br>
    <input type="submit" value="提交">
</form>

服务端接收

  • 此时可以上传文件
  • 默认位置是在C盘,以临时文件的形式存储
  • 可以使用断点方式查看,放行之后,该临时文件将被删除,并不会保存
@Slf4j
@RestController
@RequestMapping("/upload")
public class commonController {
    @PostMapping()
    public Result<String> uploadFile(String username, Integer age, MultipartFile file){
        log.info("文件上传:{},{},{}",username,age,file);
        return Result.success();
    }
}

注意:要想接收到文件,表单项file name=“file”,必须和服务端 MultipartFile file ,名字一致都是file

  • 如果名字不一致,需要使用@RequestParam注解绑定参数

本地存储

在服务端,接收到上传上来的文件之后,将文件存储在本地服务器磁盘中。一般很少用本地存储方式,该存储方式,在前端页面中是无法直接访问的,而且服务器的磁盘空间有限

@Slf4j
@RestController
@RequestMapping("/upload")
public class commonController {
    @PostMapping()
    public Result<String> uploadFile(String username, Integer age, MultipartFile file) throws IOException {
        log.info("文件上传:{},{},{}",username,age,file);

        //获取原始文件名
        String filename = file.getOriginalFilename();

        //构造唯一文件名
        //获取最后一个.的索引
        int index = filename.lastIndexOf(".");
        //得到文件扩展名
        String extname=filename.substring(index);
        String newFileName= UUID.randomUUID().toString()+extname;
        //将接收到的文件存储在本地
        file.transferTo(new File("C:\\Users\\SuperJohn\\Desktop\\upload\\"+newFileName));
        return Result.success();
    }
}

设置上传文件大小

默认上传文件大小为1MB,超出将报错,此时我们需要修改文件上传的大小
在properties文件中指定上传文件大小,根据配置文件的格式不同编写格式也不同

#配置单个文件最大上传大小
spring.servlet.multipart.max-file-size=10MB

#配置单个请求最大上传大小(一次可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB

阿里云OSS

前端请求文件上传,使用阿里云OSS对象存储服务,此时就不需要将文件存储在本地服务器了,直接将文件上传到OSS

准备工作

开通阿里云OSS,参照对应的手册,在官网就可以做

  • 注册阿里云
  • 开通对象存储服务
  • 创建bucket
  • 获取AccesKey
  • 参照官方sdk编写入门程序

引入阿里云OSS相关依赖

导入maven坐标
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.17.4</version>
</dependency>
  • 如果是java9以上的版本,则还需要添加jaxb相关依赖,代码如下:
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.3</version>
</dependency>
引入阿里云OSS上传文件的工具类
package com.coda.updatefile.common;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;

/**
 * 阿里云 OSS 工具类
 */
public class AliOSSUtils {

    private String endpoint = "oss-cn-beijing.aliyuncs.com";
    private String accessKeyId = "LTAI5t8SLkc824n2zc1EtnCx";
    private String accessKeySecret = "bDtlIqNvy3yl7uWrJQgcwmq0yBRPrR";
    private String bucketName = "sky-take-out-coda";

    /**
     * 实现上传图片到OSS
     */
    public String upload(MultipartFile file) throws IOException {
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        // 避免文件覆盖
        String originalFilename = file.getOriginalFilename();
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));

        //上传文件到 OSS
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        ossClient.putObject(bucketName, fileName, inputStream);

        //文件访问路径
        String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

图片上传接口
@Slf4j
@RestController
@RequestMapping("/upload")
public class commonController {
    @Autowired
    private AliOSSUtils aliOSSUtils;

    @PostMapping()
    public Result<String> uploadFile(String username, Integer age, MultipartFile file) throws IOException {
        log.info("文件上传:{},{},{}",username,age,file);

        //调用阿里云OSS工具类
        String url = aliOSSUtils.upload(file);
        log.info("上传成功后的url:{}",url);

        return Result.success();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值