腾讯云COS对象储存实现文件上传进度表显示

Java连接腾讯云COS对象储存实现文件上传接口详细配置Java连接本地redis往期的文章,这篇文章建立在这一篇上。

文件上传的时候将对应进度,将进度保存在redis中,进度监听如果进度变更,则更新redis中的值,前端调用接口访问redis中的进度值,如果为100则断开请求。这里我查了几篇文章但是都不是很全,故而我

    @Autowired
    private PutObjectProgressListener putObjectProgressListener;

    /**
     * 记录进度上传
     *
     * @param file
     * @return
     */
    @Override
    public  ResponseDto uploadOSSToll(MultipartFile file) {
        ResponseDto responseDto = null;
        String originalfileName = file.getOriginalFilename();
        //设置文件key
        String filePath = getFileKey(originalfileName);
        /**
         * 这里用带进度条的OSS上传
         * 第三个参数是File而不是官网介绍的InputStream,否则获取不到进度
         * MultipartFile转File
         */
        File f = null;
        try {
            f = File.createTempFile("tmp", null);
            file.transferTo(f);
            f.deleteOnExit();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 将对应的值设置到PutObjectProgressListener,
        putObjectProgressListener.setKeyRedos(originalfileName,f.length());
        // 上传 --> 带进度条上传
        cosClient.putObject(new PutObjectRequest(bucketName, originalfileName, f)
                .withGeneralProgressListener(putObjectProgressListener));
        // 关闭client
        cosClient.shutdown();
        String url = path + "/" + filePath;
        Map<String, String> map = new HashMap<>();
        map.put("fileName", originalfileName);
        map.put("url", url);
        return new ResponseDto(10000, "成功并返回数据", map);
    }

putObjectProgressListener 便是进度监控,setKeyRedos方法将对应的值进行初始化

/**
 * @author lv.Gui
 * @description
 * @date 2021/10/25 10:24
 **/
@Component
public class PutObjectProgressListener implements ProgressListener {

    private long bytesWritten = 0;
    private long totalBytes = -1;
    private String key = "";
    private int percent = 0;
    private boolean succeed = false;
    
    @Autowired
   private StringRedisTemplate redisTemplate;


    public void setKeyRedos(String key, Long size) {
        this.totalBytes = size;
        this.key = key;
        redisTemplate.opsForValue().set(key, String.valueOf(percent));
    }

    @Override
    public void progressChanged(ProgressEvent progressEvent) {
        long bytes = progressEvent.getBytes();
        ProgressEventType eventType = progressEvent.getEventType();
        switch (eventType) {
            case TRANSFER_STARTED_EVENT:
                break;
            case REQUEST_CONTENT_LENGTH_EVENT:
                this.totalBytes = bytes;
                break;
            case REQUEST_BYTE_TRANSFER_EVENT:
                this.bytesWritten += bytes;
                if (this.totalBytes != -1) {
                    int percent = (int) (this.bytesWritten * 100.0 / this.totalBytes);
                    //将进度percent放入redis中
                    redisTemplate.opsForValue().set(key, String.valueOf(percent));
                }
                break;
            case TRANSFER_COMPLETED_EVENT:
                this.succeed = true;
                break;
            case TRANSFER_FAILED_EVENT:
                break;
            default:
                break;
        }
    }
}

这里便实现了进度监视。这里设置了文件限制的大小,一般小文件不需要去显示进度表。

#multipart文件限制大小
spring.servlet.multipart.max-file-size=500MB
spring.servlet.multipart.max-request-size=500MB

在这里插入图片描述
redis中显示为53

在这里插入图片描述
当上传成功之后,redis中的值便是100了。
在这里插入图片描述

可以使用腾讯云官方提供的Java SDK,具体步骤如下: 1. 在pom.xml文件中引入腾讯云cos-java-sdk-v5依赖: ```xml <dependency> <groupId>com.qcloud</groupId> <artifactId>cos_api</artifactId> <version>5.6.19</version> </dependency> ``` 2. 创建腾讯云cos的配置类: ```java @Configuration public class TencentCosConfig { @Value("${tencent.cos.secretId}") private String secretId; @Value("${tencent.cos.secretKey}") private String secretKey; @Value("${tencent.cos.region}") private String region; @Value("${tencent.cos.bucketName}") private String bucketName; @Bean public COSCredentials cosCredentials() { return new BasicCOSCredentials(secretId, secretKey); } @Bean public ClientConfig clientConfig() { ClientConfig clientConfig = new ClientConfig(); clientConfig.setRegion(new Region(region)); return clientConfig; } @Bean public COSClient cosClient() { return new COSClient(cosCredentials(), clientConfig()); } @Bean public String bucketName() { return bucketName; } } ``` 其中,secretId和secretKey是腾讯云提供的访问密钥,region是存储桶所在的地域,bucketName是存储桶的名称。可以在配置文件中配置这些变量,这里用@Value注解获取。 3. 在上传文件的Controller中注入cosClient和bucketName,实现文件上传方法: ```java @RestController public class FileController { @Autowired private COSClient cosClient; @Autowired private String bucketName; @PostMapping("/uploadFile") public String uploadFile(@RequestParam("file") MultipartFile file) throws Exception { ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentLength(file.getSize()); objectMetadata.setContentType(file.getContentType()); String fileName = UUID.randomUUID().toString() + "." + FilenameUtils.getExtension(file.getOriginalFilename()); PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, file.getInputStream(), objectMetadata); cosClient.putObject(putObjectRequest); return "https://" + bucketName + ".cos." + "region" + ".myqcloud.com/" + fileName; } } ``` 这里上传文件的方式为MultipartFile类型,使用Apache Commons IO工具类获取文件后缀名,并用UUID生成随机文件名。然后创建PutObjectRequest对象,调用cosClient的putObject方法上传文件,最后将文件URL返回给前端。 希望以上信息能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我的天才女友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值