腾讯云cos对象存储服务文件上传api就是一个大坑
一、介绍
对象存储服务(Cloud Object Service)是基于腾讯多年海量服务经验,对外提供的可靠、安全、易用的海量存储服务。提供多样化接入方式,以及全国部署的上传加速集群,可以无缝衔接CDN进行加速下载。
二、cos 文件上传api源码
/** * 单个文件上传,适用于小文件 * * @param bucketName * bucket名称 * @param remotePath * 远程文件路径 * @param localPath * 本地文件路径 * @return 服务器端返回的操作结果,成员code为0表示成功,具体参照文档手册 * @throws Exception */ public String uploadFile(String bucketName, String remotePath, String localPath) throws Exception { if (!FileProcess.isLegalFile(localPath)) { String errorMsg = localPath + " is not file or not exist or can't be read!"; LOG.error(errorMsg); JSONObject errorRet = new JSONObject(); errorRet.put(ResponseBodyKey.CODE, ErrorCode.PARAMS_ERROR); errorRet.put(ResponseBodyKey.MESSAGE, errorMsg); return errorRet.toString(); } FileInputStream localFileInputStream = null; try { localFileInputStream = FileProcess.getFileInputStream(localPath); return uploadFile(bucketName, remotePath, localFileInputStream); } catch (Exception e) { LOG.error("UploadFile {} occur a error {}", localPath, e.toString()); throw e; } finally { FileProcess.closeFileStream(localFileInputStream, localPath); } }
三、为什么是个坑
从上面的代码中,我们可以看出,使用cos的文件上传接口,我们需要指定远程文件地址(就是我们需存储到cos的那个目录下的那个文件比如/folder/1.txt)和本地文件路径。下面我用三点来说为什么是个坑
1.在实际的开发中,很多时候,我们上传文件到web后端,在controller中以file对象存在,像spring mvc 的MultipartFile 对象是不容易获取到服务器缓存该文件的路径;
2.在手机app上传文件,app通常会采用http的方式把文件以字节数组的方式传到后台服务的,莫非还需要们在后台服务缓存一下;
3.在分布式系统中一般会把文件操作放在一个专门提供上传下载的分布式服务中比如采用dubbo,在这种方式下,一般采用字节或者采用BASE64Decoder转化成字符串来传送文件内容,如果采用cos自己原有的接口,还需要缓存一下文件。
综上所述,cos原有的接口就是一个坑,根本不实用。那么有什么好的解决方法呢,请继续往下面看。
四,解决方法
在api中自己定义了一个扩展方法,把最后的localpath改为接收字节数组,代码如下:
/** * 流文件上传,适用于小文件,自定义扩展方法 * * @param bucketName * bucket名称 * @param remotePath * 远程文件路径 * @param fileContent * 文件字节数组 * @return 服务器端返回的操作结果,成员code为0表示成功,具体参照文档手册 * @throws Exception */ public String uploadFileExt(String bucketName, String remotePath, byte[] fileContent) throws Exception { String url = getEncodedCosUrl(bucketName, remotePath); String shaDigest = CommonCodecUtils.getFileSha1(fileContent); HashMap<String, String> postData = new HashMap<String, String>(); postData.put(RequestBodyKey.OP, RequestBodyValue.OP_UPLOAD); postData.put(RequestBodyKey.SHA, shaDigest); long expired = getExpiredTimeInSec(); String sign = Sign.appSignature(appId, secretId, secretKey, expired, bucketName); HashMap<String, String> httpHeader = new HashMap<String, String>(); httpHeader.put(RequestHeaderKey.Authorization, sign); return httpSender.sendFileRequest(url, httpHeader, postData, fileContent, timeOut); }
有需要的朋友只需把该方法,拷贝到CosCloud类当中就可以了。
五.把文件转化成字节数组方式
1、springmvc 上传controller中MultipartFile payfile文件参数获取成字节数组方式:
payfile.getBytes();//这个方法就可以获取字节数组
2、将file文件转化成字节数组方式
public static byte[] getByte(File file) throws Exception { byte[] bytes = null; if (file != null) { InputStream is = new FileInputStream(file); int length = (int) file.length(); if (length > Integer.MAX_VALUE) // 当文件的长度超过了int的最大值 { System.out.println("this file is max "); return null; } bytes = new byte[length]; int offset = 0; int numRead = 0; while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) { offset += numRead; } // 如果得到的字节长度和file实际的长度不一致就可能出错了 if (offset < bytes.length) { System.out.println("file length is error"); return null; } is.close(); } return bytes; }}
注:非常大家浏览这篇文章,如果有什么不懂的或者有错的地方请大家多多指教,谢谢!
腾讯云cos对象存储服务文件上传api就是一个大坑相关推荐
- SpringBoot整合腾讯云COS对象存储实现文件上传
企业级项目开发中都会有文件.图片.视频等文件上传并能够访问的场景,对于初学者Demo可能会直接存储在应用服务器上:对于传统项目可能会单独搭建FastDFS.MinIO等文件服务来实现存储,这种方案可能 ...
- 腾讯 COS 对象存储 - SDK 文件上传对接,示例代码
文章目录 腾讯 COS 对象存储 - SDK 文件上传对接,示例代码 1.SDK 2.工具类代码 3.使用示例 腾讯 COS 对象存储 - SDK 文件上传对接,示例代码 1.SDK <depe ...
- 使用腾讯云cos对象存储服务托管静态网站
1.开通cos对象存储服务 在腾讯云服务官网的菜单栏中找到对象存储,或者服务搜索框中搜索对象存储,都可以快捷地找到对象存储产品页面. 按提示开通相关服务即可. 开通服务之后,进入对象存储管理控制台,如 ...
- 阿里云OSS对象存储(文件上传与下载)宝宝级教程
1.注册自己的阿里云账号 2.登录账号以后,进入主页面搜索"对象存储OSS 然后可以看到如下界面 立即购买,自己学习使用可以选择购买最小的存储空间,半年即可 管理控制台,购买了存储空间以后可 ...
- 腾讯云COS对象存储图片文件API的详细步骤过程
首先创建一个桶.相当于你存储图片的容器.我这里是存储图片. 我选则是共有读,私有写.因为不选择共有读的话,以后别的地方没办法访问 注意: 公有读权限可以通过匿名身份直接读取您存储桶中的数据,存在一定的 ...
- 腾讯cos做文件服务器,将腾讯云COS对象存储挂载至腾讯云服务器实现大硬盘存储...
老蒋在前面的文章中有介绍到腾讯云COS对象存储的用途还是比较大的,有我们常见的用来当做网盘使用,也可以将用来网站静态文件分离,同时还有可以作为数据同步备份.在这篇文章中,我还准备测试商家支持将COS挂 ...
- 腾讯云cos html,腾讯云COS对象存储基础设置全攻略记录
腾讯云专题网在"创建腾讯云COS存储准备部署静态资源分离 及获取API授权"文章中分享到我们如何创建腾讯云COS对象存储以及获取API密钥的方法.但是,如果我们将腾讯云COS存储用 ...
- linux的常用操作——基于ftp的windows10和腾讯云centos操作系统之间的文件上传和下载
\qquad在腾讯云服务器的centos操作系统上,安装vsftpd并进行配置,然后基于ftp实现windows10操作系统和腾讯云centos系统之间的文件上传和下载. 文章目录 1.基于腾讯云服务 ...
- html5 dzzxjbd cn,UEditor实现单张图片上传至腾讯云(对象存储服务)功能(html5
UEditor文件上传默认只支持后端语音,因为项目是前后端分离开发,所以需要前端自行实现图片上传. 这里是直接修改的 ueditor/ueditor.all.js文件 ueditor.all.js中找 ...
最新文章
- 千万用户同时在线,优酷智能档在双11“猫晚”直播如何防卡顿?
- 从源码分析DEARGUI之add_listbox
- 利用计算机模拟人脑进行演绎,2014年4月自学考试计算机应用技术试题
- spring mvc之HandlerMapping
- ftl if else判断_07.合意就执行,不行就拉倒-if/else条件控制(一)
- 爬虫爬取链接中文字_使用爬虫技术爬取图片链接并下载图片
- 【NLP】四万字全面详解 | 深度学习中的注意力机制(二)
- 分布式ID-美团(Leaf)
- 编程语言的发展趋势及未来方向(5):元编程
- android 系统ui修改器,分享两个效果 - Android 系统 UI 管理
- 前端学习(778):随机数方法
- python怎么另起一行继续输入_python如何换行继续输入
- python画雷达图-使用Python绘制雷达图
- 正则匹配,只保留中文、英文、数字
- 什么是Usenet | 第2部分
- linux实用技巧:通过命令行安装deb软件包
- Velodyne VLP16激光雷达的使用(非常详细)
- 安卓8.1系统SDK去掉系统设置中的自动调节亮度
- 【Go】解析X509
- 腾讯视频采集规则+发布模块(基于火车头全站采集与发布站点教程)
热门文章
- 网上交易的卫兵—数字证书和数字签名
- AliOS Things入门(1) 基于STM32L4与MDK搭建AliOS Things2.1.0开发环境
- MathType如何编辑等号带点
- java调用dll 指针参数_java调用c dll,指针参数和结构体参数搞定 | 学步园
- BZOJ3168. 【HEOI2013】钙铁锌硒维生素
- Clion设置背景图片
- 海贝思蓝牙接收器Linux,特定场景使用测评,电视民工的海备思蓝牙X2发射接收器使用心得。...
- 这几款app疫情期间活跃度为何如此高?方法太可了吧
- linux区分物理机和虚拟机,如何判断linux服务器是虚拟机还是物理机
- Java开发之路—Java反射机制