冷知识:COS上传文件时可以同步获取文件信息

 背景介绍

本文将介绍如何在上传文件到 COS 时同步获取文件信息,如图片的宽高、格式等。

目前,可以通过 COS 上传接口,如 PUT Object、CompleteMultipartUploads 等将文件存储至 COS 存储桶中,我们针对以下三种场景提供上传时同步获取文件信息的方式:

图片

ReturnBody 是 COS 对外提供的一种获取文件信息的方式。在上传请求(PUT Object、POST Object、CompleteMultipartUploads)中携带 x-cos-return-body 头部,传入自定义的 ReturnBody 参数,便可在请求响应结果中获取到文件信息 。

Pic-Operations 是上传时的一个请求包头,在上传请求(PUT Object、POST Object、CompleteMultipartUploads)中携带该包头并设置需要返回原图信息的参数,就可在图片上传至 COS 时同步获取原图信息。

说明  Pic-Operations 是由数据万象服务提供的获取图片信息的能力,使用时会产生图片基础处理费用。

主要流程如下图所示:

图片

 场景一:同步获取文件元信息

如需要在上传文件后,同步获取文件元信息,可以通过 ReturnBody 实现。在上传请求头部中携带由文件元信息组成的 ReturnBody 参数,便可在请求响应结果中获取到文件元信息。

ReturnBody 提供以下文件元信息参数

图片

使用时,需要先自定义构造 ReturnBody 参数,这是您希望在返回结果中获取到的文件元信息。

注意   ReturnBody 参数的 key 可以自定义名称,value 必须跟上述 ReturnBody 提供的变量名保持一致。

请求示例

// ReturnBody 参数的 key 可以自定义名称,value 必须跟 ReturnBody 提供的变量保持一致
{
"bucket": "${bucket}",
"key": "${object}",
"filesize": "${size}",
"mime_type": "${mimeType}"
}

再将 ReturnBody 参数转换为字符串,并进行 URL 安全的 Base64 编码,可以得到:

eyJidWNrZXQiOiIke2J1Y2tldH0iLCJrZXkiOiIke29iamVjdH0iLCJmaWxlc2l6ZSI6IiR7c2l6ZX0iLCJtaW1lX3R5cGUiOiIke21pbWVUeXBlfSJ9
 

之后便可在上传文件的请求中,通过设置请求头部 x-cos-return-body 传入上面 Base64 编码后的结果,即可在请求响应中获取到自定义的 bucket、key、filesize、mime_type 文件信息。

响应示例


HTTP/1.1 200 OK
x-cos-request-id: NWU5MDNkZjVfYzVjNzJhMDlfMjVhNzNfMWMy****{
"bucket":"examplebucket-1250000000000",
"filesize":"30262104",
"key":"test.pptx",
"mime_type":"application/vnd.openxmlformats-officedocument.presentationml.presentation"
}

 场景二:同步获取图片信息

如需要在上传图片文件后,同步获取图片信息,有两种实现方式:通过 ReturnBody 同步获取图片信息 和 通过 Pic-Operations 同步获取图片信息。同步获取图片信息后,可以用于后续处理,如给图片分类、打标签等操作。

注意

1. 两种实现方式都依赖数据万象(Cloud Infinite,CI)服务的能力。使用前需先开通数据万象并绑定存储桶,可参考 存储桶操作。

2. 获取图片信息会由 CI 服务收取基础图片处理费用,详情可参考  图片处理费用 。

方式一:通过 ReturnBody 同步获取图片信息

通过 ReturnBody 同步获取图片信息的方式,需要在上传请求头部中携带由图片信息组成的 ReturnBody 参数,便可在请求响应结果中获取到图片信息。

说明   当前仅支持在中国大陆公有云地域使用。

ReturnBody 提供的图片信息包括:图片基本信息(imageInfo)和图片 exif 信息。

其中,图片基本信息(imageInfo)包括:

图片

图片 exif 信息主要是记录拍摄的硬件或软件信息,包含但不限于以下几项:

图片

使用时,仍需根据 ReturnBody 提供的图片信息先自定义构造  ReturnBody 参数。为了避免 ReturnBody 携带的内容太多,影响接口性能,不支持直接填写${imageInfo}或${exif},必须写明具体的子变量,例如${变量名.子变量}、${变量名.二级子变量}。

注意

ReturnBody 参数的 key 可以自定义名称,value 必须跟上述 ReturnBody 提供的变量名保持一致。

请求示例


// ReturnBody 参数的 key 可以自定义名称,value 必须跟 ReturnBody 提供的变量保持一致
{
"color_space": "${exif.ColorSpace.val}",
"format": "${imageInfo.format}",
"width": "${imageInfo.width}",
"height": "${imageInfo.height}",
"md5": "${imageInfo.md5}",
"bit_depth": "${imageInfo.bit_depth}",
"vertical_dpi": "${imageInfo.vertical_dpi}",
"horizontal_dpi": "${imageInfo.horizontal_dpi}"
}

再将 ReturnBody 参数转换为字符串,并进行 URL 安全 的 Base64 编码,可以得到:

eyJjb2xvcl9zcGFjZSI6IiR7ZXhpZi5Db2xvclNwYWNlLnZhbH0iLCJmb3JtYXQiOiIke2ltYWdlSW5mby5mb3JtYXR9Iiwid2lkdGgiOiIke2ltYWdlSW5mby53aWR0aH0iLCJoZWlnaHQiOiIke2ltYWdlSW5mby5oZWlnaHR9IiwibWQ1IjoiJHtpbWFnZUluZm8ubWQ1fSIsImJpdF9kZXB0aCI6IiR7aW1hZ2VJbmZvLmJpdF9kZXB0aH0iLCJ2ZXJ0aWNhbF9kcGkiOiIke2ltYWdlSW5mby52ZXJ0aWNhbF9kcGl9IiwiaG9yaXpvbnRhbF9kcGkiOiIke2ltYWdlSW5mby5ob3Jpem9udGFsX2RwaX0ifQ

之后便可在上传文件的请求中,通过设置请求头部 x-cos-return-body 传入上面 Base64 编码后的结果,即可在请求响应中获取到自定义的 color_space、format、width、height 等图片信息。

响应示例
HTTP/1.1 200 OK
x-cos-request-id: NWU5MDNkZjVfYzVjNzJhMDlfMjVhNzNfMWMy****{
"bit_depth":"8",
"color_space":"sRGB",
"format":"png",
"height":"800",
"horizontal_dpi":"0",
"md5":"4f5c260f63af3c56cea542a1c62a0a1b",
"vertical_dpi":"0",
"width":"1200"
}

方式二:通过 Pic-Operations 同步获取图片信息

通过 Pic-Operations 同步获取图片信息的方式,只需要在请求包头部中加入 Pic-Operations 项并设置需要返回原图信息参数,就可在图片上传至 COS 后同步获取原图信息。

通过 putObject 上传图片,请求头中设置 Pic-Operations,设置 is_pic_info 为 1,代表返回原图信息。在请求结果中可以拿到原图图片信息。

请求示例

PUT /filename.jpg HTTP/1.1
Host: examplebucket-1250000000.cos.ap-chengdu.myqcloud.com
Date: Tue, 04 Apr 2023 09:06:15 GMT
Authorization:XXXXXXXXXXXX
Pic-Operations: {"is_pic_info":1}
Content-Length: 64[Object]

响应示例


HTTP/1.1 200 OK
Content-Type: application/xml
Content-Length: 645
Date: Tue, 04 Apr 2023 09:06:16 GMT
Status: 200 OK
x-cos-request-id: NWFjMzQ0MDZfOTBmYTUwXzZkZV8z****<UploadResult><OriginalInfo><Key>filename.jpg</Key><Location>examplebucket-1250000000.cos.ap-chengdu.myqcloud.com/filename.jpg</Location><ETag>&quot;580cd6930444576523c25f86ce2af9b1fc2d5484&quot;</ETag><ImageInfo><Format>JPEG</Format><Width>640</Width><Height>427</Height><Quality>100</Quality><Ave>0xa18454</Ave><Orientation>1</Orientation><FrameCount>1</FrameCount></ImageInfo></OriginalInfo>
</UploadResult>

说明

1. Pic-Operations 支持 COS V5 的分块上传同步获取图片信息,在使用 COS V5 的 Complete Multipart Upload 接口时只需在请求包头部中加入 Pic-Operations 项,在分片上传完成后可以在请求结果中获取到图片信息。

2. Pic-Operations 只能在数据万象支持的地域使用。

3. 仅支持 32M 以内的图片。

 场景三:同步获取媒体文件信息

注意

通过 ReturnBody 同步获取媒体文件信息依赖数据万象(Cloud Infinite,CI)服务的媒体处理功能。使用前需先开通数据万象并绑定存储桶,并开启媒体处理功能开关。获取媒体文件信息会由 CI 服务收取视频元信息获取费用 。

如需要在上传媒体文件后,同步获取媒体文件信息,可以通过 ReturnBody 实现。在上传请求头部中携带由媒体文件信息组成的 ReturnBody 参数,便可在请求响应结果中获取到媒体文件信息。

说明 

当前仅支持在中国大陆公有云地域使用。

ReturnBody 提供的媒体文件信息主要内容可参考下表 。

图片

使用时,仍需根据 ReturnBody 提供的媒体文件信息先自定义构造  ReturnBody 参数。为了避免 ReturnBody 携带的内容太多,影响接口性能,不支持直接填写${videoInfo},必须写明具体的子变量,例如${变量名.子变量}、${变量名.二级子变量}。

注意   ReturnBody 参数的 key 可以自定义名称,value 必须跟上述 ReturnBody 提供的变量名保持一致。

请求示例


// ReturnBody 参数的 key 可以自定义名称,value 必须跟 ReturnBody 提供的变量保持一致
{
"video_bit_rate": "${videoInfo.video.bit_rate}",
"video_codec_name": "${videoInfo.video.codec_name}",
"video_profile": "${videoInfo.video.profile}",
"video_pix_fmt": "${videoInfo.video.pix_fmt}",
"audio_bit_rate": "${videoInfo.audio.bit_rate}",
"audio_codec_name": "${videoInfo.audio.codec_name}",
"duration": "${videoInfo.format.duration}",
}

再将 ReturnBody 参数转换为字符串,并进行 URL 安全 的 Base64 编码,可以得到:


eyJ2aWRlb19iaXRfcmF0ZSI6IiR7dmlkZW9JbmZvLnZpZGVvLmJpdF9yYXRlfSIsInZpZGVvX2NvZGVjX25hbWUiOiIke3ZpZGVvSW5mby52aWRlby5jb2RlY19uYW1lfSIsInZpZGVvX3Byb2ZpbGUiOiIke3ZpZGVvSW5mby52aWRlby5wcm9maWxlfSIsInZpZGVvX3BpeF9mbXQiOiIke3ZpZGVvSW5mby52aWRlby5waXhfZm10fSIsImF1ZGlvX2JpdF9yYXRlIjoiJHt2aWRlb0luZm8uYXVkaW8uYml0X3JhdGV9IiwiYXVkaW9fY29kZWNfbmFtZSI6IiR7dmlkZW9JbmZvLmF1ZGlvLmNvZGVjX25hbWV9IiwiZHVyYXRpb24iOiIke3ZpZGVvSW5mby5mb3JtYXQuZHVyYXRpb259In0

之后便可在上传文件的请求中,通过设置请求头部 x-cos-return-body 传入上面 Base64 编码后的结果,即可在请求响应中获取到自定义的 video_bit_rate、video_codec_name、video_profile 等媒体文件信息。

响应示例
HTTP/1.1 200 OK
x-cos-request-id: NWU5MDNkZjVfYzVjNzJhMDlfMjVhNzNfMWMy****{
"audio_bit_rate":"189.375000",
"audio_codec_name":"aac",
"duration":"123.875000",
"video_bit_rate":"2936.675000",
"video_codec_name":"h264",
"video_pix_fmt":"yuv420p",
"video_profile":"Main"
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/646455.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows主机Navicat远程连接到Ubuntu18.04虚拟机MySQL

1. 在虚拟机上安装MySQL sudo apt-get install mysql-server sudo apt-get install libmysqlclient-dev 2. 检查安装 sudo netstat -tap | grep mysql 3. 查看默认密码 sudo cat /etc/mysql/debian.cnf 4. 用查看到的密码登录MySQL server&#xff0c;修改root用户的密码 …

javaWebssh宠物基地管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh宠物基地管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

PostgreSQL插件说明

PostgreSQL插件是一种扩展PostgreSQL功能的程序。社区版插件管理需要超级用户权限&#xff0c;而华为公有云PostgreSQL提供了一种简单易用的插件管理方案&#xff0c;可以在数据库中创建、更新和删除插件&#xff0c;无需超级用户权限。它不仅可以增加特定的数据类型、函数、操…

JS进阶-内置构造函数(二)

小提示&#xff1a;这些内置函数在开发使用的频率非常的频繁&#xff0c;建议认真看一下&#xff0c;并背一下 目录 知识回顾&#xff1a; • Object 三个常用静态方法&#xff08;静态方法就是只有构造函数Object可以调用的&#xff09; Object.keys Object.values Obj…

brpc负载均衡load balance和服务发现name servicing

1.SharedLoadBalancer&#xff08;load_balancer.h&#xff09;&#xff1a;包含LoadBalancer指针_lb&#xff0c;AddServersInBatch 2.LoadBalancerWithNaming&#xff1a;继承SharedLoadBalancer和NamingServiceWatcher 2.1Init函数&#xff1a;SharedLoadBalancer::Init&a…

梯度的计算

文章目录 import torch as tc# 以函数f(x) x^2 为例子&#xff0c;求梯度 x1 tc.tensor(1,dtypetc.float64,requires_gradTrue) g1 tc.autograd.grad(x1**2,x1)[0] print(f"The grad of x**2 at {x1} is {g1}")(x1 ** 2).backward() print(f"The grad of x*…

四、MySQL之增删改

一、插入数据 1.1、VALUES的方式添加 使用这种语法一次只能向表中插入一条数据。 1.1.1、为表的所有字段按默认顺序插入数据 INSERT INTO 表名 VALUES (value1,value2,....);// 值列表中需要为表的每一个字段指定值&#xff0c;并且值的顺序必须和数据表中字段定义时的顺序相…

浅谈WPF之UI布局

一个成功的软件&#xff0c;离不开人性化的UI设计&#xff0c;如何抓住用户第一视觉&#xff0c;让用户产生依赖感&#xff0c;合适优雅的布局必不可少。本文以一些简单的小例子&#xff0c;简述WPF中布局 面板 控件的使用&#xff0c;仅供学习分享使用&#xff0c;如有不足之处…

AWS 云监控工具

Amazon Web Services&#xff08;AWS&#xff09;是 Amazon 提供的云计算平台&#xff0c;为企业提供技术服务&#xff0c;包括计算能力、存储和数据库。借助 AWS&#xff0c;企业无需购买、拥有或维护物理数据中心和服务器&#xff0c;而 AWS 的即用即付方法使企业能够避免与 …

vcruntime140.dll找不到的多种解决方法分享,修复vcruntime140.dll文件

当操作电脑软件的过程中弹出一个错误提示“vcruntime140.dll已加载,但找不到入口点”&#xff0c;这通常意味着程序所依赖的vcruntime140.dll文件可能已经丢失、遭到破坏&#xff0c;或者该文件的路径及位置在软件开发时未被正确配置。此外&#xff0c;这种情况还有可能是因为电…

Windows11 Copilot助手开启教程(免费GPT-4)

Windows11上开启Copilot助手教程踩坑指南 Copilot介绍Copilot开启步骤1、更新系统2、更改语言和区域3、下载 ViVeTool 工具4、开启Copilot 使用 Copilot介绍 Windows Copilot 是 Windows 11 中的一个新功能&#xff0c;它可以让你与一个智能助理进行对话&#xff0c;获取信息&…

应用协议漏洞

应用协议漏洞 一、rsync rsync是Linux下一款数据备份工具&#xff0c;支持通过rsync协议、ssh协议进行远程文件传输。其中rsync协议默认监听873端口 1.未授权访问 打开靶场 判断漏洞是否存在 rsync rsync://目标ip:端口读取文件 rsync rsync://47.99.49.128:873/src/tmp/下…

2024年的Rust与Go,你看明白了吗?

Rust和Go哪个更好&#xff1f;你应该为下一个项目选择哪种语言&#xff0c;为什么&#xff1f;两者在性能、简单性、安全性、功能特性、规模化(scale)和并发性等方面如何比较&#xff1f;它们有什么共同点&#xff0c;又有什么根本区别&#xff1f;让我们通过Rust和Go的友好且公…

浏览器打开本地应用和程序制作安装包

1、引言 最近使用python开发一款windows应用&#xff0c;有一个需求是从浏览器打开本地应用。从网上查到可以通过注册表的方法完成需求。所以就需要往注册表写内容。因此应用需要在安装的时候写注册表。 2、安装包制作工具&#xff1a;NSISVNISEdit NSIS可以制作安装包&…

JVM内存问题排查

本文又名《对JVM一窍不通的我快速开始排查应用内存问题》。主要系统性地整理了排查思路&#xff0c;为大家遇到问题时提供全面的排查流程&#xff0c;不至于漏掉某些可能性误入歧途浪费时间。 基本原则 由于本文的定位是Cookbook,基本原则是让整个流程能够系统化规范化的同时将…

Nodejs一键发布脚本

背景 前端项目或者nodejs项目分开发、测试、生产环境&#xff0c;有的没有没有接入 jenkins。每次都需要进行本地打包, 手动压缩上传到服务器目录&#xff0c;ssh 登录服务器后备份旧文件, 手动删除文件再将包解压到指定目录&#xff0c;操作流程比较繁琐&#xff0c;需要提前…

Vue2学习之第六、七章——vue-router与ElementUI组件库

路由 理解&#xff1a; 一个路由&#xff08;route&#xff09;就是一组映射关系&#xff08;key - value&#xff09;&#xff0c;多个路由需要路由器&#xff08;router&#xff09;进行管理。前端路由&#xff1a;key是路径&#xff0c;value是组件。 1.基本使用 安装vue-…

蓝桥杯基础准备2

一、排序库 1.1 数组排序 默认升序。 int[] a {1,2,5,8,3,4,6}; Arrays.sort(a); int len a.length; for(int i 0;i<len;i) {System.out.print(a[i]" "); } 用Lambda实现升序&#xff1a; //自定义排序使用lambda表达式 //一维数组要使用引用数据类型 Int…

李沐《动手学深度学习》深度学习计算

系列文章 李沐《动手学深度学习》预备知识 张量操作及数据处理 李沐《动手学深度学习》预备知识 线性代数及微积分 李沐《动手学深度学习》线性神经网络 线性回归 李沐《动手学深度学习》线性神经网络 softmax回归 李沐《动手学深度学习》多层感知机 模型概念和代码实现 李沐《…

Java设计模式中的代理模式

Java设计模式中的代理模式 代理模式是一种结构型设计模式&#xff0c;它提供了一个代理对象&#xff0c;以控制对其他对象的访问。代理可以充当中介&#xff0c;用于控制对真实对象的访问。 代码举例演示 静态代理&#xff1a; // 接口 interface Subject {void request();…