文件上传专题

普通方式

  • 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);
}
相关推荐
shawxlee18 小时前
vue3在public下封装config.js自定义配置动态数据,可在打包后直接修改,方便后端部署及后续维护
前端·javascript·经验分享·vue·团队开发·js·项目优化
Jelena1577958579218 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
kyriewen19 小时前
我给前端项目的接口请求套了6层保护——才发现以前一直在裸奔
前端·javascript·面试
神明不懂浪漫19 小时前
【第五章】Java中的继承与多态
java·开发语言
郝亚军20 小时前
如何安装webstorm、Node.js和vue CLI
前端·javascript·vue.js
AI多Agent协作实战派21 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug
gaolei_eit21 小时前
Java+Ai+vue
java·spring·maven
qq_2518364571 天前
基于java Web 动漫视频网站毕业论文
java·开发语言·前端
LayZhangStrive1 天前
JUC相关的函数、注解、变量杂记
java·面试·多线程·juc
未秃头的程序猿1 天前
给公司做了个AI客服Agent,用的Spring AI 1.0,3天上线领导拍板了
java·后端·ai编程