文件上传专题

普通方式

  • 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);
}
相关推荐
alonewolf_995 分钟前
深入解析G1与ZGC垃圾收集器:原理、调优与选型指南
java·jvm·算法
小镇学者6 分钟前
【c++】C++字符串删除末尾字符的三种实现方法
java·开发语言·c++
rfidunion8 分钟前
springboot+VUE+部署(1。新建项目)
java·vue.js·spring boot
小翰子_8 分钟前
Spring Boot整合Sharding-JDBC实现日志表按月按周分表实战
java·spring boot·后端
weixin_3993806916 分钟前
OA 系统假死问题分析与优化
java·运维
wuk99824 分钟前
梁非线性动力学方程MATLAB编程实现
前端·javascript·matlab
XiaoYu200235 分钟前
第11章 LangChain
前端·javascript·langchain
豆沙沙包?35 分钟前
2026年--Lc334-2130. 链表最大孪生和(链表转数组)--java版
java·数据结构·链表
柒.梧.43 分钟前
SSM常见核心面试问题深度解析
java·spring·面试·职场和发展·mybatis
杨章隐1 小时前
Java 解析 CDR 文件并计算图形面积的完整方案(支持 MultipartFile / 网络文件)@杨宁山
java·开发语言