springboot 上传文件到阿里云oss

本文介绍如何使用阿里云OSS SDK进行文件的上传和删除操作,并提供了完整的工具类实现及前后端代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、引入阿里云sdk

<!-- aliyun-oos -->
<dependency>
    <groupId>com.aliyun.oss</groupId>
    <artifactId>aliyun-sdk-oss</artifactId>
    <version>3.10.2</version>
</dependency>

二、工具类

目前只有上传,删除。工具类有待完善!!!!!!

阿里云ossSDK文档:https://help.aliyun.com/document_detail/32008.html?spm=a2c4g.11186623.6.908.3ec155acouwSeI

 public String endpoint;
    public String accessKeyId;
    public String accessKeySecret;
    public String bucketName;
    /**
     * 获取阿里云OSS客户端对象
     *
     * @return ossClient
     */
    private OSS  getOSSClient() {
         endpoint=service.selectConfigByKey("aly_endpoint");
         accessKeyId=service.selectConfigByKey("aly_accessKeyId");
         accessKeySecret=service.selectConfigByKey("aly_accessKeySecret");
        bucketName=service.selectConfigByKey("aly_bucketName");
        return  new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
    }

    /**
     * 上传文件
     */
    public String uploadFile(MultipartFile file) throws Exception {
        // 创建OSSClient实例。
        OSS ossClient = getOSSClient();

        try{
            String filename = file.getResource().getFilename();
            //这里文件名用了uuid 防止重复,可以根据自己的需要来写
            String name = UUID.randomUUID() + filename.substring(filename.lastIndexOf("."), filename.length());
            name = "video/"+name.replace("-", "");
            // 填写网络流地址。
            InputStream inputStream = file.getInputStream();
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, name, inputStream);
            ossClient.putObject(putObjectRequest);
            //6 返回上传之后地址,拼接地址
            String uploadUrl = "https://"+bucketName+"."+endpoint+"/"+name;
            return uploadUrl;
        }catch (Exception e){
            throw e;
        }finally {
            ossClient.shutdown();
        }
    }

    /**
     * 批量删除oss文件
     * @param keys 文件路径列表
     * @throws Exception
     */
    public void deleteFile(List<String> keys)  throws Exception{
        OSS ossClient = getOSSClient();
        try{
            DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
            deleteObjectsResult.getDeletedObjects();
        }catch (Exception e){
            throw e;
        }finally {
            ossClient.shutdown();
        }
    }

三、前端代码

<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" >
<head>
    <th:block th:include="include :: header('新增锻炼管理')" />
    <th:block th:include="include :: bootstrap-fileinput-css" />
</head>
<body class="white-bg">
    <div class="wrapper wrapper-content animated fadeInRight ibox-content">
        <form class="form-horizontal m" id="form-takeexercise-add">
            <div class="form-group">
                <label class="col-sm-3 control-label">标题:</label>
                <div class="col-sm-8">
                    <textarea id="title" name="title" class="form-control"></textarea>
                </div>
            </div>
            <div class="form-group">    
                <label class="col-sm-3 control-label">类型:</label>
                <div class="col-sm-8">
                    <select id="type" name="type" class="form-control m-b" th:with="type=${@dict.getType('takeexercise')}">
                        <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
                    </select>
                </div>
            </div>
            <div class="form-group">
                <label class="col-sm-3 control-label">备注:</label>
                <div class="col-sm-8">
                    <textarea id="remark" name="remark" class="form-control"></textarea>
                </div>
            </div>
            <div class="form-group">
                <label class="col-sm-3 control-label is-required">视频:</label>
                <div class="col-sm-8">
                    <div class="file-loading">
                        <input id="fileinput-demo-1" name="file" type="file" required>
                    </div>
                </div>
            </div>
        </form>
    </div>
    <th:block th:include="include :: footer" />
    <th:block th:include="include :: bootstrap-fileinput-js" />
    <script th:inline="javascript">
        var prefix = ctx + "system/takeexercise"
        $("#form-takeexercise-add").validate({
            focusCleanup: true
        });
        $(document).ready(function () {
            $("#fileinput-demo-1").fileinput({
                'theme': 'explorer-fas',
                'uploadUrl': prefix+'/add',
                overwriteInitial: false,
                showPreview:false,
                showUpload: false,
                uploadAsync:false, //false 同步上传,后台用数组接收,true 异步上传,每次上传一个file,会调用多次接口
                previewClass:"uploadPreview"
            }).on("change", function() {
                // 清除掉上次上传的图片
                $(".uploadPreview").find(".file-preview-frame:first").remove();
                $(".uploadPreview").find(".kv-zoom-cache:first").remove();
            }).on("filebatchselected", function(e, files) {
                //$(this).fileinput("upload");             // 文件选择完直接调用上传方法。
            }).on('filebatchuploadsuccess',function(event,data,previewId,index) {
                console.log(data);
            }).on("filebatchselected", function(event, data) {
                var fileDir = $("#fileinput-demo-1").val();
                var suffix = fileDir.substr(fileDir.lastIndexOf("."));
                if(fileDir == "" ){
                    alert("选择需要导入的视频文件!");
                    return false;
                }
                if(suffix !=".mp4"){
                    alert("选择mp4格式的文件导入!");
                    return false;
                }
            })
        });

        function submitHandler() {
            if ($.validate.form()) {
                var formData = new FormData();
                formData.append("title", $('#title').val());
                formData.append("type", $('#type').val());
                formData.append("remark", $('#remark').val());
                formData.append("file", $('#fileinput-demo-1')[0].files[0]);
                var config = {
                    url: prefix+'/add',
                    type: "post",
                    dataType: "json",
                    data: formData,
                    processData: false,//必须要加
                    contentType: false,//必须要加
                    beforeSend: function () {
                        $.modal.loading("正在处理中,请稍后...");
                        $.modal.disable();
                    },
                    complete: function () {
                        $.modal.loading("正在处理中,请稍后...");
                        $.modal.disable();
                    },
                    success: function(result) {
                        $.operate.successCallback(result);
                    }
                };
                $.ajax(config);
            }
        }
    </script>
</body>
</html>

四、后端

@PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(@RequestParam("file") MultipartFile file, Takeexercise takeexercise) {
        try {
            if(file!=null){
                AliyunOssUtil aliyunOssUtil=new AliyunOssUtil();
                String url=aliyunOssUtil.uploadFile(file);
                takeexercise.setVideoUrl(url);
            }
            return toAjax(takeexerciseService.insertTakeexercise(takeexercise));
        }catch (Exception e){
            e.printStackTrace();
            logger.error(e.getMessage());
            return toAjax(0);
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值