文件上传专题

普通方式

  • 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);
}
相关推荐
刘发财2 小时前
弃用html2pdf.js,这个html转pdf方案能力是它的几十倍
前端·javascript·github
皮皮林5516 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河6 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程9 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
ssshooter9 小时前
看完就懂 useSyncExternalStore
前端·javascript·react.js
Live0000010 小时前
在鸿蒙中使用 Repeat 渲染嵌套列表,修改内层列表的一个元素,页面不会更新
前端·javascript·react native
柳杉10 小时前
使用Ai从零开发智慧水利态势感知大屏(开源)
前端·javascript·数据可视化
躺平大鹅11 小时前
Java面向对象入门(类与对象,新手秒懂)
java
球球pick小樱花11 小时前
游戏官网前端工具库:海内外案例解析
前端·javascript·css