文件上传专题

普通方式

  • action:地址
  • method:必须是post
  • enctype:是编码方式,传递文件,必须是,multipart/form-data

因为文件是二进制传输,不设置编码方式,只会传递文件名。

html 复制代码
<form action="http://localhost:8080/upload", method="post" enctype="multipart/form-data">
    姓名:<input type="text" name="name" /><br/>
    年龄:<input type="text" name="age" /> <br>
    头像:<input type="file" name="file" /> <br>
    <input type="submit" value="提交">
</form>

后端接收到的文件,其实是一个临时文件中存在的,并不是源文件。一般在C盘temp下

java 复制代码
@PostMapping
public String getLogin(String name, String age, MultipartFile file) throws IOException {
    String originalFilename = file.getOriginalFilename();
    Assert.isTrue(originalFilename != null, "请上传文件");
    String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
    // 新文件名
    String s = UUID.randomUUID() + extension;
    // 保存文件
    file.transferTo(new File("D:\\yun\\" + s));
    return s;
}

配置接收

yml 复制代码
spring:
  servlet:
    multipart:
      # 单个文件大小
      max-file-size: 10MB
      # 单次请求大小
      max-request-size: 100MB

使用RAM用户访问密钥上传文件至 OSS

创建一个 Bucket

首先创建一个用户

创建一个权限策略

在用户页面,使用该权限策略

注意创建 AccessKey

创建时,会展示 access-key 和 secret-key,注意 secret-key 只会展示一次。

用于调用服务使用。

配置 Yml

在 Bucket 概述中记住这个

yml 复制代码
alibaba:
  cloud:
    access-key-id: 你的 access-key-id
    secret-access-key: 你的 secret-access-key
    oss:
      endpoint: oss-cn-beijing.aliyuncs.com

上传文件接口

maven

xml 复制代码
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.17.4</version>
</dependency>

配置Bean

java 复制代码
@Configuration
public class OSSConfig {

    @Bean(destroyMethod = "shutdown")
    public OSS endpoint(@Value("${alibaba.cloud.oss.endpoint}") String endpoint,
                        @Value("${alibaba.cloud.access-key-id}") String accessKeyId,
                        @Value("${alibaba.cloud.secret-access-key}") String secretAccessKey) {
        DefaultCredentialProvider defaultCredentialProvider =
                new DefaultCredentialProvider(accessKeyId, secretAccessKey);

        ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
        clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
        return OSSClientBuilder.create()
                .endpoint("https://" + endpoint)
                .credentialsProvider(defaultCredentialProvider)
                .clientConfiguration(clientBuilderConfiguration)
                .region(extractRegion(endpoint))
                .build();
    }

    /**
     * 获取 region
     */
    private String extractRegion(String endpoint) {
        if (endpoint == null) return null;
        int start = endpoint.indexOf("oss-");
        int end = endpoint.indexOf(".aliyuncs.com");
        if (start == -1 || end == -1 || start + 4 >= end)
            throw new IllegalArgumentException("Invalid endpoint: " + endpoint);
        return endpoint.substring(start + 4, end);
    }

}
java 复制代码
private final OSS ossClient;

@PostMapping
public String getLogin(MultipartFile file) throws IOException {
    String originalFilename = file.getOriginalFilename();
    Assert.isTrue(originalFilename != null, "请上传文件");
    String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
    // 新文件名
    String s = UUID.randomUUID() + extension;

    // 调用 OSS 上传文件。
    toOSSFile(file.getInputStream(), s);

    return s;
}

public void toOSSFile(InputStream inputStream, String name) {
    String bucketName = "gulimaill-hi";
    PutObjectRequest putObjectRequest =
            new PutObjectRequest(bucketName, "test/" + name, inputStream);
    // 上传文件。
    ossClient.putObject(putObjectRequest);
}
相关推荐
13 小时前
java关于内部类
java·开发语言
好好沉淀13 小时前
Java 项目中的 .idea 与 target 文件夹
java·开发语言·intellij-idea
gusijin13 小时前
解决idea启动报错java: OutOfMemoryError: insufficient memory
java·ide·intellij-idea
To Be Clean Coder13 小时前
【Spring源码】createBean如何寻找构造器(二)——单参数构造器的场景
java·后端·spring
吨~吨~吨~14 小时前
解决 IntelliJ IDEA 运行时“命令行过长”问题:使用 JAR
java·ide·intellij-idea
你才是臭弟弟14 小时前
SpringBoot 集成MinIo(根据上传文件.后缀自动归类)
java·spring boot·后端
短剑重铸之日14 小时前
《设计模式》第二篇:单例模式
java·单例模式·设计模式·懒汉式·恶汉式
摘星编程14 小时前
React Native + OpenHarmony:自定义useFormik表单处理
javascript·react native·react.js
码农水水14 小时前
得物Java面试被问:消息队列的死信队列和重试机制
java·开发语言·jvm·数据结构·机器学习·面试·职场和发展
summer_du14 小时前
IDEA插件下载缓慢,如何解决?
java·ide·intellij-idea