JS上传图片文件到腾讯云对象存储COS

上传图片到腾讯云主要有两个步骤:
1、鉴权
2、开始上传

需要引入两个JS文件:cos-js-sdk-v5.min.js和jquery-2.1.4.min.js,这两个文件的链接我已放在后面。
鉴权可以直接使用SecretId和SecretKey生成cos对象,但把SecretId和SecretKey暴露在前端页面这样不太安全,我们采用从服务端申请临时秘钥的方式生成cos对象。 上传成功后的图片链接也可以通过域名+自定义key拼接生成,如下。
前端页面全部代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8"/>
    <title>腾讯云COS图片上传</title>
    <script type="text/javascript" src="jquery-2.1.4.min.js"></script>
    <script type="text/javascript" src="cos-js-sdk-v5.min.js"></script>
</head>
<body>
<input type="file" accept="image/*" id="file_upload" value="" multiple/>

<div class="image_container">
    <img id="preview" style="height:130px;width:117px;border-width:0px;"/>
</div>
</body>
<script>
    //腾讯云对象存储
    var cos = new COS({
        // 必选参数
        getAuthorization: function (options, callback) {
            $.ajax({
                method: 'GET',
                url: 'http://localhost:8080/shortTimeSignatureSDK',
                beforeSend: function (xhr) {
                    xhr.setRequestHeader('Content-Type', 'application/json');
                },
                dataType: 'json',
                success: function (data) {
                    var credentials = data && data.credentials;
                    if (!data || !credentials) return console.error('credentials invalid');
                    callback({
                        TmpSecretId: credentials.tmpSecretId,
                        TmpSecretKey: credentials.tmpSecretKey,
                        XCosSecurityToken: credentials.sessionToken,
                        // 建议返回服务器时间作为签名的开始时间,避免用户浏览器本地时间偏差过大导致签名错误
                        StartTime: data.startTime, // 时间戳,单位秒,如:1580000000
                        ExpiredTime: data.expiredTime, // 时间戳,单位秒,如:1580000900
                    });
                }
            });
        }
    });

    function checkImage(file) {
        const isIMAGE = file.type === 'image/jpeg' || 'image/jpg' || 'image/png';
        const isLt1M = file.size / 1024 / 1024 < 1;
        if (!isIMAGE) {
            alert('上传文件只能是图片格式!')
        }
        if (!isLt1M) {
            alert('上传文件大小不能超过 1MB!')
        }
        return isIMAGE && isLt1M
    }


    const domainUrl = "https://live-cover-picture-1256967716.cos.ap-chengdu.myqcloud.com/"

    $(function () {
        $("#file_upload").change(function () {
            var $file = $(this);
            var fileObj = $file[0];
            var imgList = []
            var windowURL = window.URL || window.webkitURL;
            var dataURL;
            var $img = $("#preview");
            //图片预览
            if (fileObj && fileObj.files && fileObj.files[0]) {
                dataURL = windowURL.createObjectURL(fileObj.files[0]);
                $img.attr('src', dataURL);
            } else {
                dataURL = $file.val();
                var imgObj = document.getElementById("preview");
                imgObj.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale)";
                imgObj.filters.item("DXImageTransform.Microsoft.AlphaImageLoader").src = dataURL;
            }
            // let fileObject = fileObj.files[0]
            let timestamp, imgTmp, key;
            for (i = 0; i < fileObj.files.length; i++) {
                timestamp = (new Date()).getTime()
                imgTmp = fileObj.files[i]
                if (checkImage(imgTmp)) {
                    cos.putObject({
                        Bucket: 'live-cover-picture-1256967716',
                        Region: 'ap-chengdu',
                        Key: timestamp .toString(), /* 必须 */
                        StorageClass: 'STANDARD',
                        Body: imgTmp, // 上传文件对象
                        onProgress: function (progressData) {
                            console.log(JSON.stringify(progressData));
                        }
                    }, function (err, data) {
                        console.log(err || data);
                        console.log("上传成功的图片链接为:"+(domainUrl+timestamp.toString()))
                    });
                } else {
                    alert("上传文件格式错误")
                }
            }
        });

    });

</script>
</html>

其中生成cos对象请求生成临时秘钥的接口http://localhost:8080/shortTimeSignatureSDK的后端代码如下:
注意将下面的secretId和secretKey换成自己的。

    @RequestMapping(value = "/shortTimeSignatureSDK", method = RequestMethod.GET)
    @ResponseBody
    public String getShortTimeSignatureSDK() {
        TreeMap<String, Object> config = new TreeMap<String, Object>();
        try {
            // 云 API 密钥 secretId
            config.put("secretId", "换成自己的secretId");//
            // 云 API 密钥 secretKey
            config.put("secretKey", "换成自己的secretKey");//
            //若需要设置网络代理,则可以如下设置
//            if (properties.containsKey("https.proxyHost")) {
//                System.setProperty("https.proxyHost", properties.getProperty("https.proxyHost"));
//                System.setProperty("https.proxyPort", properties.getProperty("https.proxyPort"));
//            }

            // 临时密钥有效时长,单位是秒
            config.put("durationSeconds", 1800);

            // 换成你的 bucket
            config.put("bucket", "live-cover-picture-1256967716");//ad-picture-1256967716
            // 换成 bucket 所在地区
            config.put("region", "ap-chengdu");
            config.put("allowPrefix", "*");

            // 密钥的权限列表。简单上传和分片需要以下的权限,其他权限列表请看 https://cloud.tencent.com/document/product/436/31923
            String[] allowActions = new String[]{
                    // 简单上传
                    "name/cos:PutObject",
                    // 表单上传
                    "name/cos:PostObject",
//                    // 分片上传: 初始化分片
//                    "name/cos:InitiateMultipartUpload",
//                    // 分片上传: 查询 bucket 中未完成分片上传的UploadId
//                    "name/cos:ListMultipartUploads",
//                    // 分片上传: 查询已上传的分片
//                    "name/cos:ListParts",
//                    // 分片上传: 上传分片块
//                    "name/cos:UploadPart",
//                    // 分片上传: 完成分片上传
//                    "name/cos:CompleteMultipartUpload"
            };
            config.put("allowActions", allowActions);
            // 请求临时密钥信息

            org.json.JSONObject credential = CosStsClient.getCredential(config);
            // 请求成功:打印对应的临时密钥信息
            System.out.println(credential.toString(4));
            return credential.toString();
        } catch (Exception e) {
            // 请求失败,抛出异常
            throw new IllegalArgumentException("no valid secret !");
        }
    }

上面需要的引入的js文件和源代码地址

要在LayUI中使用腾讯云对象存储服务,需要完成以下步骤: 1. 首先,在腾讯云控制台中创建一个对象存储桶,并获取该桶的密钥信息,包括SecretId、SecretKey和Token。 2. 在LayUI中引入腾讯云对象存储的JavaScript SDK,可以通过以下方式引入: ```html <script src="https://cdn.jsdelivr.net/npm/cos-js-sdk-v5/dist/cos-js-sdk-v5.min.js"></script> ``` 3. 创建一个上传文件的方法,代码如下: ```javascript function uploadToCos(file) { // 创建COS SDK实例 var cos = new COS({ SecretId: 'yourSecretId', SecretKey: 'yourSecretKey', SecurityToken: 'yourToken' }); // 上传文件 cos.putObject({ Bucket: 'yourBucketName', Region: 'yourBucketRegion', Key: file.name, Body: file, onProgress: function(progressData) { console.log(JSON.stringify(progressData)); } }, function(err, data) { if (err) { console.log(err); } else { console.log(data); } }); } ``` 其中,`yourSecretId`、`yourSecretKey`和`yourToken`分别为腾讯云对象存储的密钥信息,`yourBucketName`为对象存储桶的名称,`yourBucketRegion`为对象存储桶所在的地域。 4. 在HTML中添加一个文件选择控件和上传按钮,代码如下: ```html <input type="file" id="file-selector"> <button id="upload-btn">上传</button> ``` 5. 给上传按钮添加点击事件,调用上传文件的方法,代码如下: ```javascript document.getElementById('upload-btn').addEventListener('click', function() { var file = document.getElementById('file-selector').files[0]; uploadToCos(file); }); ``` 通过以上步骤,就可以在LayUI中使用腾讯云对象存储服务上传文件了。需要注意的是,上传文件时需要确保文件大小不超过50MB,否则需要使用分块上传
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

qzxl

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

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

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

打赏作者

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

抵扣说明:

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

余额充值