文件上传(本地、OSS)

什么是文件上传:将文件上传到服务器。

文件上传-本地存储

前端

<template>
<div>
    <!-- 上传文件需要设置表单的提交方式为post,并设置enctype属性、表单项的type属性设置为file -->
    <form action="http://localhost:8080/wedu/upload" method="post" enctype="multipart/form-data">
    姓名:<input type="text" name="username"><br>
    年龄:<input type="text" name="age"><br>
    头像:<input type="file" name="image"><br>
    <input type="submit" value="提交">
  </form>
</div>
</template>

<script>
export default {

}
</script>

<style>

</style>

后端

因为要构造唯一的文件名,所以先来介绍一下uuid(通用唯一识别码,例如:d98b850e-7ad7-40c7-98ac-1d4f72b67124)

package org.test;

import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.UUID;

@SpringBootTest
public class ApplicationTest {
    @Test
    public void testUuid(){
        for (int i = 0;i < 1000;i++){
            //调用java.util.UUID类的下述方法生成随机的UUID字符串
            String uuid = UUID.randomUUID().toString();
            System.out.println(uuid);
        }
    }
}

正式编写后端: 

package com.wedu.modules.ColdChainVehicleDevice.controller;

import com.wedu.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@RestController
@Slf4j
public class FileController {
    /*
    1、什么是文件上传:将文件上传到服务器
        * 前端提交过来的文件需要使用Spring提供的 MultipartFile类型的参数 来接收,
    无论是本地存储还是OSS存储文件MultipartFile的参数名必须和前端发送文件的请求参数名相同
        * 上传过来的文件是一个临时文件,当文件上传的请求响应完毕后,这个临时文件会被删除

    2、如何将服务端接收到的文件存储起来?
        * 本地存储:在服务端,接收到上传上来的文件后,将文件存储在本地服务器磁盘中。
     */
    @PostMapping("/upload")
    public R upload(String username, Integer age, MultipartFile image) throws Exception {
        //输出日志到控制台
        log.info("文件上传:{},{},{}",username,age,image);

        //获取原始文件名
        String originalFilename = image.getOriginalFilename();

        //构造唯一的文件名(文件名不能重复,不然会覆盖)- uuid(通用唯一识别码,例如:d98b850e-7ad7-40c7-98ac-1d4f72b67124)
        int index = originalFilename.lastIndexOf(".");  //获取到原始文件名最后一个点的位置
        String extname = originalFilename.substring(index);  //截取文件名的后缀
        String newFileName = UUID.randomUUID().toString() + extname;
        log.info("新的文件名:{}",newFileName);

        //将传过来的文件存储在服务器的本地磁盘目录中(D:\Desktop\wedu)
        image.transferTo(new File("D:\\Desktop\\wedu\\" + newFileName));

        return R.ok();
    }
}

SpringBoot配置文件

spring:
  servlet:
    multipart:
      max-file-size: 100MB    #配置单个文件上传的大小限制
      max-request-size: 100MB   #配置单个请求最大的文件大小限制
      enabled: true

MultipartFile接口的常用方法:

文件上传-阿里云OSS存储

阿里云

先来介绍一下阿里云,它对外提供了各种各样的云服务,如下图:

阿里云OSS

现在开始介绍阿里云OSS

使用第三方服务的通用思路

阿里云OSS-使用步骤

官方SDK编写入门程序参照: 

步骤:①安装->②配置访问凭证->③找到文件/对象中的上传文件中的简单上传的上传文件流部分复制代码

阿里云OSS官方文档

阿里云OSS-集成

在web项目中使用阿里云OSS的步骤:

package com.wedu.common.utils;

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 = "https://填你自己的地域节点";
    private String accessKeyId = "填你自己的accessKeyId";
    private String accessKeySecret = "填你自己的accessKeySecret";
    private String bucketName = "填你自己的存储桶名称";

    /**
     * 实现上传图片到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的路径返回
    }

}
package com.wedu.modules.ColdChainVehicleDevice.controller;

import com.wedu.common.utils.AliOSSUtils;
import com.wedu.common.utils.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.UUID;

@RestController
@Slf4j
public class FileController {

    @Autowired
    private AliOSSUtils aliOSSUtils;

    @PostMapping("/upload")
    public R upload(MultipartFile image) throws IOException {
        log.info("文件上传,文件名:{}",image.getOriginalFilename());
        String url = aliOSSUtils.upload(image);  //调用阿里云OSS工具类将文件上传到阿里云OSS中
        log.info("文件上传完成,文件访问的url:{}",url);
        return R.ok().put("url",url);   //将图片上传到阿里云OSS后的url返回,用于浏览器回显展示
    }
}

最后在postman中测试成功:

上一篇:在 PostgreSQL 中,如何处理多个长时间运行的查询对系统资源的竞争?-三、示例


下一篇:vscode运行java中文乱码,引发的mac配置问题