前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端上传文件到腾讯云(对象存储)

前端上传文件到腾讯云(对象存储)

作者头像
何处锦绣不灰堆
发布于 2020-05-29 04:13:15
发布于 2020-05-29 04:13:15
15K00
代码可运行
举报
文章被收录于专栏:农历七月廿一农历七月廿一
运行总次数:0
代码可运行

好吧,没写之前简单的说一下为什么要写,我还是怀着比较沉重的心情写的这篇教程,主要是心里没底,不知道能写明白不,不过既然提笔了,那就硬着头皮写吧,没办法,毕竟跌跌撞撞总算是搞出来了。还有就是我百度了,没有教程,所以更坚定了我写这篇博文的心。

需要分析

我为什么要将文件上传到服务器,很简单,文件太大,公司的带宽不行,上传一个文件需要的时间太长,导致的是用户体验太差,那么怎么解决这个问题,很有效的解决办法是将文件上传到阿里云或者腾讯云上,我们需要的时候将URL拿到就可以,这样是速度最快的。

官方API地址

javaScript_SDK

步骤解析

既然要使用对象存储,第一步要买这个,不然怎么用?买的过程就就不写了,毕竟我也不参与,买好了以后需要配置的地方简单的说一下:

第一要申请一个bucket(存储桶)

点击其中一个您需要使用的,这个具体可以创建几个,我没有深究,不过应该是够使用的,然后是基础的配置:

配置CORS

这里需要说的是什么呢?就是这里的CORS的配置,这里是干嘛的呢?就是您提交文件的时候,请求的URL是不是支持,您的URL如果是www.baidu.com?name=123&sex=nan,那么您的这个URl是不是可以被腾讯云识别,就要看您的这个CORS里面有没有配置这个。

ok写到这里我突然想起来了,其实我们在购买存储以后,腾讯云会给您一系列的字段值:

这些是一会我会说到的,这里的字段不用担心,后端会处理好的,说明一下这些是做什么的,

appleId很明显就是识别身份用的

SecretId和SecretKey是用来生成签名的(我后面会说)

Bucket和Region是用来识别地区信息的

下载cos

使用之前先将js下载下来:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm i cos-js-sdk-v5 --save

我们前端怎么使用这些呢?我们如果是调试的时候当然最好是自己生成签名,然后将文件上传到腾讯云,腾讯云识别以后将文件存储进去,但是前端怎么生成签名呢?也很简单,看代码

生成签名

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var cos = new COS({
	     SecretId: '*****************************',
         SecretKey: '**************************',
		 })

COS在API里面是有介绍的,是一种文件上传的函数

这样就生成了签名

上传文件

怎么上传文件呢?

看代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cos.putObject({
		    Bucket: 'ky-********',  
		    Region: 'ap-shanghai',     
		    Key: name,
		    StorageClass: 'STANDARD',
		    Body: selectedFile, // 上传文件对象
		    onProgress: function(progressData) {
		        console.log(JSON.stringify(progressData));
		    }
		}, function(err, data) {
		    console.log(err || data);
		    console.log(data.Location);
		});	

APi文档里面有介绍

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
putObject   // 文件上传,不得超过5G
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Bucket      //容器    购买以后可以生成  下图是对应关系
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Region      //地区    购买的时候可以设置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Key         //文件名
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
StorageClass //存储方式
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Body        //文件对象

下面的是打印错误信息和成功的日志

那么这里的文件对象怎么拿到呢?

拿文件对象

看代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
	<input id="fileSelector" type="file" name="filename">
		<input id="submitBtn" type="button" οnclick="test()" value="提交">
		<img src="" id="img0" class="img-thumbnail"> 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var selectedFile;	
	 var filename;
	 $("#fileSelector").change(function(){  
	 	     selectedFile = document.getElementById('fileSelector').files[0];
	 	     filename = selectedFile.name;
		}); 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
selectedFile    //文件对象
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
filename       //文件名字  

这个其实很简单,就是操作dom将文件的内容拿到,然后拿到问价名字

完整代码

完整的代码是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<script src="../js/文件上传/cos-js-sdk-v5.js" type="text/javascript" charset="utf-8"></script>
		<script src="../js/jQuery/jquery-1.11.2.min.js" type="text/javascript" charset="utf-8"></script>
	</head>
	
	<body>
		<input id="fileSelector" type="file" name="filename">
		<input id="submitBtn" type="button" οnclick="test()" value="提交">
		<img src="" id="img0" class="img-thumbnail"> 
	</body>
	<script type="text/javascript">
	 var selectedFile;	
	 var filename;
	 $("#fileSelector").change(function(){  
	 	     selectedFile = document.getElementById('fileSelector').files[0];
	 	     filename = selectedFile.name;
		});  
	 function test(){
		var cos = new COS({
	     SecretId: '******************************',
         SecretKey: '******************************',
		 })
			cos.putObject({
		    Bucket: 'ky-1254466590',  
		    Region: 'ap-shanghai',     
		    Key: filename,
		    StorageClass: 'STANDARD',
		    Body: selectedFile, // 上传文件对象
		    onProgress: function(progressData) {
		        console.log(JSON.stringify(progressData));
		    }
		}, function(err, data) {
		    console.log(err || data);
		    console.log(data.Location);
		});	
	 }
	</script>
</html>

以上代码是前端调试的时候用的,也就是没有后端也可以将文件上传到腾讯云

签名生成原理

如果您好奇这个签名是怎么生成的,可以看源码,这部分:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 签名算法说明文档:https://www.qcloud.com/document/product/436/7778
// 步骤一:计算 SignKey
var signKey = CryptoJS.HmacSHA1(qKeyTime, SecretKey).toString();

// 步骤二:构成 FormatString
var formatString = [method, pathname, obj2str(queryParams), obj2str(headers), ''].join('\n');

// 步骤三:计算 StringToSign
var stringToSign = ['sha1', qSignTime, CryptoJS.SHA1(formatString).toString(), ''].join('\n');

// 步骤四:计算 Signature
var qSignature = CryptoJS.HmacSHA1(stringToSign, signKey).toString();

// 步骤五:构造 Authorization
var authorization = ['q-sign-algorithm=' + qSignAlgorithm, 'q-ak=' + qAk, 'q-sign-time=' + qSignTime, 'q-key-time=' + qKeyTime, 'q-header-list=' + qHeaderList, 'q-url-param-list=' + qUrlParamList, 'q-signature=' + qSignature].join('&');
console.log("签名是:"+authorization);
return authorization;

验证流程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
https://www.qcloud.com/document/product/436/7778

写的很详细,这是流程图:

成功状态

statusCode :200说明文件上传成功

那么腾讯云有没有这个文件呢?

当然是有的。

错误码

所有的状态码都会返回只要是不正确的,这里可以查API里面的错误状态码错误码可以很好的解决遇到的问题

写到这里如果您成功上传了,那么下面的可以接着看,如果失败了,就不要看了,因为看了没意义。

怎么请求接口拿签名然后完成上传?

正常的情况下是不会说只让前端操作上传的,一般是请求后端的接口,拿到签名以后再执行上传的操作,这个时候怎么操作呢?

结合后端上传

请求接口

看代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 var cos = new COS({
		   getAuthorization: function (options, callback) {
		        // 异步获取签名
		        $.get('/user/getAutograph/'+filename, {
		            method: (options.Method || 'PUT').toLowerCase(),
		            pathname: '/' + (options.Key || '')
		        }, function (authorization) {
		            callback(authorization);
		        }, 'text');
		    }
		});

当然这里的filename您是可以不填的,这里我是以为需要做一个不重复名字才这样写的,这个名字是我用GUID生成以后处理的,GUID怎么生成这个,我之前写过,您可以找一下,避免出现上传重复文件的问题,腾讯云是上传重复文件的时候会覆盖掉,所以为了不丢数据,只能这样做。

还有一点就是上传的时候一般是需要预览的:

例如这样的,我之前写过预览的功能,您可以找一下

那么生成了签名以后,下面的步骤就和之前写的一样了,就不写重复代码了。

写到这里基本就完成了,但是相信您不是很明白,所以我也不知道怎么说可以说的更明白,只能哪里不明白您再问吧!

更新

更新时间:2018-7-24

更新内容:解决问题

问题1:签名怎么来的?也就是SecretId和SecretKey两个参数哪里看的?

回答:首先解释一下什么是签名,所谓的签名只是腾讯或者阿里这些公司起的名字,您需要拿到一个类似于门牌号的东西,这样您上传到阿里或者腾讯文件的时候,他可以根据您门牌号知道是您!怎么获取呢?看截图

PS:当然为了安全起见,这个只建议前端调试的时候用,正常的上传是需要后端将签名动态获取的,原理是一样的!

问题2:sdk的js 是做什么的?怎么可以获取?

回答:sdk 的js是做什么的呢?和我们平常写的js是一样的,动态语言而已,只是腾讯给起了一个名字罢了。获取的方式有两种,我上面写的是我们平常安装了nodejs环境的情况下,直接通过命令:npm i cos-js-sdk-v5 --save

但是如果您的电脑没有安装nodejs是不是就不可以下载了呢,当然不是,直接到我的csdn下载里面就可以,或者去腾讯的官网下载也是有的!

问题3:出错以后怎么调试,什么情况下是成功了?

回答:这个怎么调试其实是根据自己的经验来的,他和我们平常出错调试是一样的,直接打开页面F12进入调试页面(如果您的是mac笔记本的话,直接右上角三个点的地方,点击开发者工具)首先看console是不是报错,报的什么错,然后看network里面文件是不是加载完毕了!不是的话,就解决一下。当statucode = 200的时候就是成功了,如果您不明白什么是状态码,直接登录到您的存储桶里面看看是不是有您上传的文件,有的话就是成功了!

问题4:什么是白名单?怎么新增?

回答:白名单不明白的话,黑名单总明白吧?黑名单是做什么的,为了让别人联系不到您,是不是,白名单就是为了让别人可以联系到您!怎么新增呢?看截图

ok,基本上就这些,感谢你们的提问,有什么不明白的可以随时联系我咨询,我尽量答复,会持续更新文章!

下面是每一句话的注释:(照顾一下好奇心强的)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<!--这个叫做引用js文件(所谓的js就是操作页面动态的语言,可以通过这个sdk的js调到腾讯的接口,以便于完成对腾讯的对接)-->
		<script src="js/cos-js-sdk-v5.js" type="text/javascript" charset="utf-8"></script>
		<script src="js/jquery-1.11.1.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<!--这是html代码,怎么写都行-->
		<input id="fileSelector" type="file" name="filename">
		<input id="submitBtn" type="button" onclick="test()" value="上传">
		<img src="" id="img0" class="img-thumbnail"> 
	</body>
	<script type="text/javascript">
	 var selectedFile; //选择文件	
	 var filename;   // 文件名字
	 $("#fileSelector").change(function(){  //这是用户操作时候执行的函数
	 	     selectedFile = document.getElementById('fileSelector').files[0]; //通过操作com拿到用户选择的文件,当然这里也可以操作jquery拿数据
	 	     filename = selectedFile.name; //文件.name是获取源文件的文件名(固定用法)
	 	     console.log("文件的名字是:"+filename);//这行是日志
		});  
	 function test(){
	 	/*这部分是获取签名*/
		var cos = new COS({
	     SecretId:  '*********************************',
         SecretKey: '*********************************',
		 })
		/*这部分是腾讯提供的上传的接口*/
			cos.putObject({
		    Bucket: '************',  //存储桶用户识别   (必须有)
		    Region: '*********',     //地区识别(必须有)
		    Key: filename,  //文件名字(这里需要注意的是,如果名字是一样的,那么后面的会覆盖前面的,所以这个名字不可以重复)(必须有)
		    StorageClass: 'STANDARD',//可以不写
		    Body: selectedFile, //上传文件对象(可以不写)
		    onProgress: function(progressData) {
		        console.log(""+JSON.stringify(progressData));
		    }
		}, function(err, data) {
			/*这里是为了调试你的代码,可以拿到报错信息*/
		    console.log(err || data);
		    console.log(data.Location);//可以拿到文件地址
		});	
	 }
	</script>
</html>

更新

更新时间:2018-7-30

更新内容:URL不显示

问题描述:有些使用者在上传以后发现location是没有的,一直是这样的:

上面显示是上传成功了,但是一直不显示URL。

解决办法:

您打开自己的存储桶,里面的CORS配置,是不是没有配置Expose-Headers这个参数,这样的:

如果不配置的话,是不显示的,配置一下是最好的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/04/28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【JVM进阶之路】十:JVM调优总结
JVM调优听起来很高大上,但是要认识到,JVM调优应该是Java性能优化的最后一颗子弹。
三分恶
2021/04/13
16.2K0
JVM
重学Java系列之深入理解JVM虚拟机6:JNDI,OSGI,Tomcat类加载器实现
hhss
2021/02/12
6830
JVM
三分钟搞明白Java内存分布,再也不怕了!!!
做Java的大都没有c++ 的那种分配内存的烦恼,因为Java 帮我们管理内存,但是这并不代表我们不需要了解Java的内存结构,因为线上经常出现内存的问题,今天聊一下内存的问题。
香菜聊游戏
2021/06/02
5150
Java堆内存又溢出了!看大师如何防范
JAVA堆内存管理是影响性能主要因素之一。 堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的。
慕容千语
2019/06/11
1.5K0
记录线上服务频繁full gc问题排查
线上服务GC问题,是JAVAJAVA程序比较典型的问题,也是非常考验工程师的排查能力。能真正排查定位的人不多,要么原理没吃透、要么没有实战经验,看到此问题无从下手。
姆斯java实战分享
2023/07/23
1.5K0
JVM的4种垃圾回收算法、垃圾回收机制与总结[通俗易懂]
JVM的4种垃圾回收算法、垃圾回收机制与总结 – 知乎 https://zhuanlan.zhihu.com/p/54851319
全栈程序员站长
2022/11/07
11.7K0
JVM的4种垃圾回收算法、垃圾回收机制与总结[通俗易懂]
JVM垃圾回收之垃圾收集算法,程序员必须掌握的知识
解释下,堆大小=新生代+老年代,新生代与老年代的比例为1:2,新生代细分为一块较大的Eden空间和两块较小的Survivor空间,分别被命名为from和to。
黎明大大
2020/09/08
4250
JVM垃圾回收之垃圾收集算法,程序员必须掌握的知识
五位卷王 | 总结的十道 JVM 面试真题!(建议收藏)
先说下哈,这次给大家带来的大厂面试题,都来源于我的知识星球,由星球的几位嘉宾 + 我 一起完成。
悟空聊架构
2022/05/13
4980
五位卷王 | 总结的十道 JVM 面试真题!(建议收藏)
春招金三银四的高频JVM面试题
为什么划分老年代和新生代,主要对象大小不一样,对象生命周期不一样。划分后,提供垃圾回收效率,节省资源,提升对象利用率等等。
猫头虎
2024/04/08
1140
春招金三银四的高频JVM面试题
Java垃圾回收器与内存分配策略
上一篇JVM内存模型讲述了Java虚拟机在运行时所管理的内存划分下的每个数据区域的各自用途,以及创建和销毁时间。当需要排查各种内存泄漏、内存溢出问题时,当来及收集成为系统达到更高并发量的瓶颈时,我们需要对JVM的GC机制和内存分配又更多的了解,这边文章是在上一篇文章的基础之上讲述了Java垃圾回收器与内存分配策略。
静默加载
2020/05/29
9430
JVM内存管理
Java内存管理是一项持续的挑战,同时也是锻造出可拓展应用的必备技能。本质上,Java内存管理就是一个为新对象分配内存和释放无用对象内存的过程。
码代码的陈同学
2018/06/03
2.3K0
JVM内存管理
JVM真香系列:堆内存详解
在 JVM中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。
田维常
2020/11/19
5570
JVM真香系列:堆内存详解
JVM的内存管理(堆内存)
也称heap堆区。堆是jvm内存中占用空间最大的一个区域。主要分为新生代、老年代、永久代(jdk1.8以后叫元空间,到1.9以后又被移除)
用户7410760
2024/12/14
2410
JVM的内存管理(堆内存)
深入理解Java中的Garbage Collection
最近由于系统业务量比较大,从生产的GC日志(结合Pinpoint)来看,需要对部分系统进行GC调优。但是鉴于以往不是专门做这一块,但是一直都有零散的积累,这里做一个相对全面的总结。本文只针对HotSpot VM也就是Oracle Hotspot VM或者OpenJDK Hotspot VM,版本为Java8,其他VM不一定适用。
Throwable
2020/06/23
7830
深入理解Java中的Garbage Collection
面试必会:JVM堆内存详解
年轻代中包含两个区:Eden 和survivor,并且用于存储新产生的对象,其中有两个survivor区
公众号 IT老哥
2020/09/16
1.2K0
面试必会:JVM堆内存详解
【Java面试题1】简单说说JVM堆的内存结构和GC回收流程
我们在Java面试中,只要是2年以上经验,一定会问你一下关于JVM方面的问题。开发两年时间不能对JVM没有了解,如果你还不了解,说明你的学习与探索能力不高,不能给到应有的加分项哦!小编也是最近刚刚开始学习,总结一下最近的学习成果。方便以后看,也希望小伙伴们看到可以帮助到您!
掉发的小王
2022/07/11
2300
【Java面试题1】简单说说JVM堆的内存结构和GC回收流程
java(9)-深入浅出GC垃圾回收机制
1、本文了解GC垃圾回收机制,深入理解GC后才明白,为啥FGC会导致stop-the-world。 2、了解GC算法。
黄规速
2022/04/14
1K0
java(9)-深入浅出GC垃圾回收机制
线上服务的FGC问题排查,看这篇就够了!
线上服务的GC问题,是Java程序非常典型的一类问题,非常考验工程师排查问题的能力。同时,几乎是面试必考题,但是能真正答好此题的人并不多,要么原理没吃透,要么缺乏实战经验。
猿天地
2020/06/10
9520
线上服务的FGC问题排查,看这篇就够了!
Java内存区域和GC机制
  Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存在自动内存管理和垃圾清扫机制。概括地说,该机制对 JVM(Java Virtual Machine)中的内存进行标记,并确定哪些内存需要回收,根据一定的回收策略,自动的回收内存,永不停息(Nerver Stop)的保证JVM中的内存空间,放置出现内存泄露和溢出问题。
Java团长
2018/08/06
5280
《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
堆内存使用分析,GC 日志解读 重要的东东 在Java中,对象实例都是在堆上创建。一些类信息,常量,静态变量等存储在方法区。堆和方法区都是线程共享的。 GC机制是由JVM提供,用来清理需要清除的对象,回收堆内存。 GC机制将Java程序员从内存管理中解放了出来,可以更关注于业务逻辑。 在Java中,GC是由一个被称为垃圾回收器的守护线程执行的。 在从内存回收一个对象之前会调用对象的finalize()方法。 作为一个Java开发者不能强制JVM执行GC;GC的触发由JVM依据堆内存的大小来决定。 Syste
程序员鹏磊
2018/02/09
1.5K0
《深入理解Java虚拟机》(六)堆内存使用分析,垃圾收集器 GC 日志解读
推荐阅读
相关推荐
【JVM进阶之路】十:JVM调优总结
更多 >
LV.0
阿里云技术专家
目录
  • 需要分析
  • 官方API地址
  • 步骤解析
  • 配置CORS
  • 下载cos
  • 生成签名
  • 上传文件
  • 拿文件对象
  • 完整代码
  • 签名生成原理
  • 验证流程
  • 成功状态
  • 错误码
  • 结合后端上传
  • 更新
  • 更新时间:2018-7-24
  • 更新内容:解决问题
    • 更新
    • 更新时间:2018-7-30
    • 更新内容:URL不显示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档