腾讯云服务器上传文件失败返回403问题及踩过的坑

1. 情景1–>403描述

公司有一个前后端分离的项目,前端通过公司的公众号内嵌文件上传页面的项目,前端直接和腾讯云服务器进行交互,上传文件,在前后端部署结束的前提下,测试发现通过公众号上传文件失败,返回403错误码,查看API文档,得到如下结果:
腾讯云服务器上传文件失败返回403问题及踩过的坑_第1张图片
签名或者权限不正确,demo,testing,预发布测试都是正确的呢,最后定位问题是在线上公众号的域名变了,没有在腾讯云账号中进行配置,进行配置之后问题解决,使用的对象存储产品,存储桶列表中进行配置:
腾讯云服务器上传文件失败返回403问题及踩过的坑_第2张图片
腾讯云服务器上传文件失败返回403问题及踩过的坑_第3张图片
提交之后,测试可以正常进行文件上传功能。
备注:这里附一个腾讯云API的设置link,根据需求设定需要的操作(https://cloud.tencent.com/document/product/436/11459)

2.情景2–>返回"error"错误信息

上传的视频文件在10M以内,上传正常;测试上线之后发现部分视频可以上传成功,部分上传不成功,上传不成功的报错信息,没有状态码,见下图:
腾讯云服务器上传文件失败返回403问题及踩过的坑_第4张图片
查看API发现上传方式有两种,对象上传和分片上传,分片上传适用于大文件上传;
对象上传代码如下:

document.getElementById('file-selector').onchange = function () {
    var file = this.files[0];
    if (!file) return;
    cos.putObject({
        Bucket: 'examplebucket-1250000000',
        Region: 'ap-beijing',
        Key: '目标路径/' + file.name,
    }, function (err, data) {
        console.log(err || data);
    });
});

分片上传代码如下:

cos.sliceUploadFile({
    Bucket: 'examplebucket-1250000000', /* 必须 */
    Region: 'ap-beijing',    /* 必须 */
    Key: '1.zip',              /* 必须 */
    Body: file,                /* 必须 */
    TaskReady: function(taskId) {                   /* 非必须 */
        console.log(taskId);
    },
    onHashProgress: function (progressData) {       /* 非必须 */
        console.log(JSON.stringify(progressData));
    },
    onProgress: function (progressData) {           /* 非必须 */
        console.log(JSON.stringify(progressData));
    }
}, function(err, data) {
    console.log(err || data);
});

因业务需求,需要上传图片和视频,小文件使用分片上传会出现上传失败,根据具体情况分析最后采用的解决办法是:视频上传使用分片上传,图片上传使用对象上传解决;
备注:这里附加腾讯云Java-SDK的link,还希望根据需要选择上传的方式(https://cloud.tencent.com/document/product/436/11459#.E4.B8.8A.E4.BC.A0.E5.AF.B9.E8.B1.A1)(https://cloud.tencent.com/document/product/436/35649#.E5.88.86.E7.89.87.E4.B8.8A.E4.BC.A0.E5.AF.B9.E8.B1.A1)

3.情景3–>访问权限生成临时密钥

在腾讯云账号权限管理中设置私有读写之后,发现上传文件之后返回的URL,直接访问是没有权限的,需要使用带有时效性的密钥进行访问,设置如下:
腾讯云服务器上传文件失败返回403问题及踩过的坑_第5张图片
上传成功后的视频在腾讯云中查看详情如下:
腾讯云服务器上传文件失败返回403问题及踩过的坑_第6张图片
这个临时链接的生成方法,根据腾讯云Java-SDK提供的方法,可根据实际进行参考(https://cloud.tencent.com/document/product/436/35217)

4.在上传文件时,使用真实的SecretId和SecretKey可能是不安全的,参考下面的生成临时的SecretId和SecretKey,根据情况使用,如果需要实际的代码,可以联系我,我将推给你(https://cloud.tencent.com/document/product/436/14048)

总结

1.在进行腾讯云服务器文件上传和下载操作时,当访问的域名发生变化时,需要进行跨域访问CORS设置,添加规则;
2.使用第三方接口时难免会遇到一些坑,要加强阅读第三方API和SDK的能力;
欢迎交流

你可能感兴趣的:(Java)