文件上传【阿里云oss】

文件上传是指将本地文件、图片、视频、音频等文件上传到服务器,供其他用户浏览和下载的过程,后端接收参数时,参数类型为MultipartFile类型,前端传递表单的enctpye属性为multipart/form-data,上传的文件是临时文件,需要进行处理

1)服务器本地存储

使用MultipartFile类型内部提供的transferTo方法:

/**
     * 文件上传
     * @param file 上传的文件
     */
    @PostMapping("/upload")
    public Result fileUpload(MultipartFile file) throws IOException {
        // 获取原始文件名
        String originalFilename = file.getOriginalFilename();
​
        // 获取文件后缀名---使用字符串中的lastIndexOf获取最后一个点的位置
        int lastIndex = originalFilename.lastIndexOf(".");
        String extname = originalFilename.substring(lastIndex);
​
        // 构建唯一的文件名----使用uuid通用唯一识别码
        String stringUUID = UUID.randomUUID().toString();
​
        // 进行文件存储---存储的文件名和上传的文件名相同
        file.transferTo(new File("/Users/frank/Pictures/upload"+stringUUID+extname));
        return Result.success();
    }

注意:springBoot中默认上传文件大小为1mb,上传大文件时,要进行配置:

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

2)使用云服务存储

  • 登陆直接的阿里云账户,创建oss对象存储服务,创建存储集合

  • 引入工具类---官方文档

注意:@Value注解无法直接加到static修饰的变量上,为解决这个问题,我们可以在类上添加@Component注解,交给ioc容器,然后在类内部提供set方法,在方法上添加对应的@Value注解

@Component
public class AliOssUtil {

    //@Value("${aliyun.oss.endpoint}")
    private static String endpoint;
    //@Value("${aliyun.oss.accessKeyId}")
    private static String accessKeyId;
    //@Value("${aliyun.oss.accessKeySecret}")
    private static String accessKeySecret;
    //@Value("${aliyun.oss.bucketName}")
    private static String bucketName;

    @Value("${aliyun.oss.endpoint}")
    public void setEndpoint(String endpoint) {
        AliOssUtil.endpoint = endpoint;
    }

    @Value("${aliyun.oss.accessKeyId}")
    public void setAccessKeyId(String accessKeyId) {
        AliOssUtil.accessKeyId = accessKeyId;
    }

    @Value("${aliyun.oss.bucketName}")
    public void setBucketName(String bucketName) {
        AliOssUtil.bucketName = bucketName;
    }

    @Value("${aliyun.oss.accessKeySecret}")
    public void setAccessKeySecret(String accessKeySecret) {
        AliOssUtil.accessKeySecret = accessKeySecret;
    }


    //上传文件,返回文件的公网访问地址
    public static String uploadFile(String objectName, InputStream inputStream){
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);
        //公文访问地址
        String url = "";
        try {
            // 创建存储空间。
            ossClient.createBucket(bucketName);
            ossClient.putObject(bucketName, objectName, inputStream);
            url = "https://"+bucketName+"."+endpoint.substring(endpoint.lastIndexOf("/")+1)+"/"+objectName;
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return url;
    }
}
  • 配置工具类中的属性值,在配置文件(.yam文件)中配置具体的值注解进行自动注入

# 阿里云常量配置
aliyun:
  oss:
    endpoint: http://oss-cn-beijing.aliyuncs.com
    bucketName: 填自己的
    accessKeyId: 填自己的
    accessKeySecret: 填自己的
  • 进行接口开发:String中的lastIndexOf可以获取字符串中从最后开始的指定字符串的位置

@Slf4j
@RestController
public class FileUploadController {
​
    /**
     * 文件上传
     * @param file
     * @return
     * @throws IOException
     */
    @PostMapping("/upload")
    public Result uploadFile(MultipartFile file) throws IOException {
        log.info("文件上传····················");
        // 获取文件原始名称
        String originalFilename = file.getOriginalFilename();
        // 使用UUID进行文件重命名
        String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
        // 上传文件,传入文件名和文件流
        String url = AliOssUtil.uploadFile(fileName, file.getInputStream());
        log.info("文件上传成功············url:{}", url);
        return Result.success(url);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值