七牛云文件上传

使用七牛云进行文件上传 一、七牛云入门测试 1、注册七牛云账号,完成后选择对象存储 2、在里面创建空间,一个空间相当于一个文件夹,就是将对象上传到的地方 创建完成后,后期上传的静态资源,可以根据域名+文件名直接访问,自定义域名必须是备案域名 3、查看个人秘钥,注册完成账号后,会有一个秘钥,上传文件的时候进行授权和认证。 4、文件上传测试 进入七牛云开发者中心 测试代码: package c... 阅读详情

           最近做的项目需要上传音视频以及图片,刚开始时候是用retrofit上传,说实话,那叫一个简单和爽啊,必须得赞一个。只需要将File往里面一放就ok了。哦哦,貌似有点跑题了偷笑。我应该说七牛云上传文件的。哈哈哈(这也足以说明retrofit上传是多么的便利了)。既然retrofit这么的方便简单,为啥还是要用七牛云呢?因为服务端害怕将来用户量大了,读写文件多了,服务器压力太大,万一搞瘫了肿么办?所以就选择了七牛云。

           其实,这个集成也比较简单。因为客户端不需要申请任何的key,所以AndroidManifest里面也不需要任何配置了;只需要在module app的build.gradle里面添加    compile 'com.qiniu:qiniu-android-sdk:7.1.3'(当然这个版本可能更新,以七牛官网为准喽)就好了。客户端的上传流程取决于服务端的上传策略,刚开始我们采用的流程是 app申请上传凭证---上传文件至七牛----七牛回调到业务服务器---业务服务器处理完毕之后回调至七牛-------七牛再次返回给app结果。哇,是不是好麻烦,流程也是非常繁琐,万一里面某个环节出现了问题,都会导致上传失败。后来经过讨论采用了第二种流程方式:app申请上传凭证-----上传文件至七牛-----七牛文件存储完毕后返回给app----app再将结果上传给业务服务器;这样最大的就是简化了业务服务器和七牛的交互,并且我们的很多业务参数也不必通过七牛传递到我们自己的服务器了。可能有朋友会问,上面的上传凭证是什么,这个是服务端通过七牛生成的一个安全凭证,只有客户端拿着这个上传凭证上传文件才是有效的,否则七牛服务器是不接受的。也算是为了安全吧。

        接下来看自己写的一个类

      

/**
 * 向七牛上传文件,然后回调业务服务器
 * Created by hexiappang_android on 16/11/28.
 */
public class UploadFileQiniuUtils1 {
    private static int SUCCESSCOUNT = 0;//上传成功个数
    private static int FAILCOUNT = 0;//失败个数
    private static String stringKeys;//上传文件后的的key的拼接
    private static UploadFileQiniuUtils1 uploadFileUtils;
    private UploadManager uploadManager;//上传管理
    private static String fileKey = null;//文件上传key;
    //单例模式获取
    public static UploadFileQiniuUtils1 getInstance(){
        if(uploadFileUtils == null){
            uploadFileUtils = new UploadFileQiniuUtils1();
        }
        //每次将原有变量清空
        SUCCESSCOUNT = 0;
        FAILCOUNT = 0;
        stringKeys= "";
        fileKey = null;
        return uploadFileUtils;
    }

    /**
     * 上传图片(可能会有多张。现在一次上传的的操作,只取一次上传凭证;然后会并发上传;)
     */
    public void uploadMultiFile(final List<String> stringList,final OnResponse onResponse){
        //获取上传凭证(这个是用retrofit从服务器获取的)
        RetrofitNetHelper.getInstance().getUploadToken(new NetResponseSubscriber<String>(null) {
            @Override
            protected void onError(ApiException ex) {
                onResponse.onFailure(ex.getDisplayMessage());
            }

            @Override
            protected void onResponse(final String stringToken, String successMsg) {
                //一个临时集合
                final List<String> listTemp = new ArrayList<>();
                //因为压缩图片也是一个耗时的过程,所以将其放入非ui线程中,压缩完成后,回调至ui线程处理(采用的是RxJava的线程切换)
                Observable.create(new Observable.OnSubscribe<List<String>>() {
                    @Override
                    public void call(Subscriber<? super List<String>> subscriber) {
                        File fileTemp;
                        //循环传入文件路径list
                        for(int i = 0;i < stringList.size();i++){
                            fileTemp = new File(stringList.get(i));
                            //如果传入的文件存在
                            if(fileTemp.exists()){
                                //进行压缩(注意下面的文件名是用时间戳+当前的文件在集合中所在位置的拼接,而不是用了文件原有的名字,应的是服务端的要求)
                                fileTemp = ImageUtils.compressBitmap(stringList.get(i),800,480, System.currentTimeMillis()+i+".jpg");
                                //如果压缩过后的图片存在,那么添加入新的list
                                if(fileTemp != null && fileTemp.exists()){
                                    listTemp.add(fileTemp.getAbsolutePath());
                                }
                            }
                        }
                        //将压缩结果发送至ui线程
                        subscriber.onNext(listTemp);
                    }
                }).subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Subscriber<List<String>>() {
                            @Override
                            public void onCompleted() {

                            }

                            @Override
                            public void onError(Throwable e) {
                                //如果有错误,那么会回调给调用方
                                onResponse.onFailure(ResourcesUtil.getString(R.string.str_uploadfail));
                            }

                            @Override
                            public void onNext(final List<String> list) {
                                //如果上传凭证非空,那么执行上传操作
                                if(!TextUtils.isEmpty(stringToken)){
                                    onResponse.onProgress(FormatUtils.resolveBuild("图片上传中","(1/",listTemp.size(),")"));
                                    //因为网络请求是异步的,所以图片请求会是同时进行的。不能保证顺序操作
                                    for(int j=0;j<list.size();j++){
                                        //七牛云上传文件管理类
                                        if (uploadManager == null) {
                                            uploadManager = new UploadManager();
                                        }
                                        File uploadFile = new File(list.get(j));
                                        //执行真正的上传操作
                                        uploadManager.put(uploadFile, uploadFile.getName(), stringToken,
                                                new UpCompletionHandler() {
                                                    @Override
                                                    public void complete(String key, ResponseInfo respInfo,
                                                                         JSONObject jsonData) {
                                                        //各个文件之间的key用逗号分隔(这个是业务的需要,大家不一定这么写)
                                                        stringKeys = FormatUtils.resolveBuild(stringKeys,key,",");
                                                        //如果某个文件上传成功
                                                        if(respInfo.isOK()){
                                                            SUCCESSCOUNT++;//成功数量+1
                                                        }else{
                                                            FAILCOUNT++;//否则失败数量+1
                                                        }
                                                        //这个是将“上传进度”回调给调用方,其实也算是是假的,因为网络请求是几乎同时发出的,也是异步的,这里只是将上传完毕的记结果给回去了
                                                        onResponse.onProgress(FormatUtils.resolveBuild("图片上传中","(",SUCCESSCOUNT,"/",list.size(),")"));
                                                        //如果所有的图片都已经上传完毕了
                                                        if(SUCCESSCOUNT + FAILCOUNT == list.size()){
                                                            if(FAILCOUNT == 0){//如果失败的为0,则代表全部都成功,然后上传key
                                                                stringKeys = stringKeys.substring(0,stringKeys.length()-1);

                                                            }else{//只要有其中一张图片上传失败则认为上传失败
                                                                onResponse.onFailure(ResourcesUtil.getString(R.string.str_uploadfail));
                                                            }
                                                        }
                                                    }
                                                }, null);
                                    }
                                }else{
                                    onResponse.onFailure(ResourcesUtil.getString(R.string.str_uploadfail));
                                }
                            }
                        });
            }
        });
    }

    /**
     * 上传单一文件(主要是音视频)
     */
    public void upLoadSingleFile(final String localPath, final OnResponse onResponse){
        //在这里构造 上传文件的key,规则是前缀+时间戳+文件后缀名
        if(type == Const.UPLOAD_AUDIO){
            fileKey = System.currentTimeMillis()+".mp3";
        }else if(type == Const.UPLOAD_VIDEO){
            fileKey = System.currentTimeMillis()+".mp4";
        }
        final File file = new File(localPath);
        if(file.exists()){
            //这里有个文件最大字节的限制
            if(file.length() > Const.MAX_FILE_BYTES){
                onResponse.onFailure("上传文件太大,不能上传");
                return;
            }
            //获取上传凭证
            RetrofitNetHelper.getInstance().getUploadToken(new NetResponseSubscriber<String>(null) {
                @Override
                protected void onError(ApiException ex) {
                    onResponse.onFailure(ex.getDisplayMessage());
                }

                @Override
                protected void onResponse(String s, String successMsg) {
                    if(!TextUtils.isEmpty(s)){
                        if (uploadManager == null) {
                            uploadManager = new UploadManager();
                        }
                        UploadOptions uploadOptions = new UploadOptions(null, null, false,
                                new UpProgressHandler() {
                                    @Override
                                    public void progress(String key, double percent) {
                                        onResponse.onProgress(FormatUtils.resolveBuild("上传中(",FormatUtils.formatNumb(percent*100),"%)"));
                                    }
                                }, null);
                        uploadManager.put(file, fileKey, s, new UpCompletionHandler() {
                            @Override
                            public void complete(String key, ResponseInfo respInfo,
                                                 JSONObject jsonData) {
                                if(respInfo.isOK()){

                                }else{
                                    onResponse.onFailure(ResourcesUtil.getString(R.string.str_uploadfail));
                                }
                            }
                        }, uploadOptions);
                    }else{
                        onResponse.onFailure(ResourcesUtil.getString(R.string.str_uploadfail));
                    }
                }
            });
        }else{
            onResponse.onFailure("上传的视频不存在");
        }
    }

    //对于文件上传结果的回调接口
    public interface OnResponse{
        void onSuccess();
        void onFailure(String message);

        /**
         * 对于文件上传进度的提示(如果是图片则会有处理中。。。以及上传position/size的提示。对于音视频则会有x%的提示了)
         */
        void onProgress(String message);
    }

}

        这个类主要是有两个方法了,一个是上传单一文件的,另外一个就是上传多张图片的,另外最后提供了将上传结果以及进度回调给调用方的接口(注释写的也比较详细了大笑)。先说那个多张图片上传的,其实一次上传操作无论是单文件的还是多文件的,我们都是只获取一次上传凭证,因为服务器设置有失效时间,当然可以确定的是一次上传过程中,这个失效时间一定是不会到的啦。大家都知道网络请求是异步的,所以貌似很难保证顺序上传了,就是一张完了接着另外一张,暂时还没想到怎么来做。另外,即使可以做到一张一张传,那样岂不是很耗时呀,用户体验可能也不是很好了。所以最终就写成了上面的样子,多张图片请求几乎是同步的了。其实用了两个变量来判断是否上传完毕了,因为网络请求几乎同时发出。所以谁先回来都不知道。所以每次返回时候判断成功个数+失败个数是否等于要上传的文件数。如果相等了代表所有图片的上传都有一个返回结果了。另外如果失败个数不为0,则会认为上传失败,则会提示用户进行重新上传了。然后单一文件的上传其实和多文件上传几乎一样,只是我们为了上传的进度,多用了一个UploadOptions了,它能够将上传的进度以double值回调回来了。

       最后还要说下上面的图片的命名,也就是我上传给七牛的key,就是uploadMagager的第二个参数了。由于当时服务端说他们指定的上传策略的缘故,我们客户端不能上传两个key一样的文件,要不然七牛会报错的,当时觉得不合理,但是服务端既然这么说了,说的那么真诚(哈哈,我好坏,我们服务端还是很给力的)然后我们就这样子做了。当时也没有验证,但是刚刚在写这篇文章的时候,我想我得试试,要不然看误导了看这篇文章的人就不好了。所以我就上传了好几张相同的图片,如下图

,然后我在七牛后台看到的是

同一个key(我用的是文件名)的文件就只有一个。所以得出的结论是,同一个文件上传多次,七牛只会存储一次了。我上面的代码暂时还没改。其实图片的名字被改的那么复杂一是满足业务需要,二是为了不重复,”不报错“。当然事实证明是没报错的。但是最终我的这个代码是否要改,还得周一去跟服务端商量。其实,这样用文件名作为key,至少能够减少一些存储空间了。

          好了,这篇博客先暂时这个样子了。如有错误,欢迎指正。多谢大笑。祝大家周末愉快。

PHP 七牛云文件上传 七牛云开发文档:developer.qiniu.com/kodo (一)Composer 安装 SDK(推荐使用) 进入cmd 终端,切换目录到你部署项目的根目录下,执行以下命令即可:composer require qiniu/php-sdk (二)传统方式安装 进入七牛云,下载官方 PHP-SDK,将下载下来的SDK解压,放入项目第三库文件(vendor 或者 extend) 使用: 申请七牛云账户; 开通对象存储功能( 目录 七牛云开发文档:developer.qiniu.co... 阅读详情

相关推荐

七牛云文件上传、处理工具类

概述 项目需要,后台所有图片需要上传到七牛云。 以下是自己写的工具类 实现 /** * 七牛云工具类 */ public class QiNiuUtils { private Logger log = LoggerFactory.getLogger(QiNiuUtils.class); private static UploadManager uploadManager;...

kris 1562

(七牛云系列)七牛云指定文件上传路径(各种语言通用)

七牛云指定文件上传路径(各种语言通用则你在上传文件时,需要将文件名修改为cs/xxx.jpg,如图第一行是文件名的生成操作,当然你也可以指定文件名。假如我们需要,把图片上传到指定的文件夹下怎么办?我们上传成功后,图片会存在相应空间的根目录。假如你有一个文件名为xxx.jpg。同时你在七牛云中有一个文件夹为cs。再次运行程序发现,已经成功!我们只需要修改文件名为。

qq_53679247的博客 5859

HFSS仿真中如何提取最大E/H场强与频率关系曲线

本文详细讲解了在HFSS仿真中提取最大E/H场强与频率关系曲线的完整流程。通过使用场计算器(Field Calculator)和创建场报告,工程师可以准确获得器件在整个频带内的电场或磁场强度峰值,并进一步推导出关键的功率容量曲线,为高功率射频器件(如滤波器、耦合器)的设计提供至关重要的安全评估依据。

ss78901的博客 1098

使用Java实现七牛云OSS云存储上传图片至指定目录

使用java实现七牛云的文件上传,完整代码,完美解决上传

Echo_A的博客 1749

STM32CubeMX和华为LiteOS Studio开发STM32

传统的STM32的开发通常使用Keil/IAR这类开发软件,随着物联网时代的到来,传统嵌入式的发展不断向物联网方向靠拢,而Keil/IAR这类开发软件无法满足IoT一站式的开发,华为LiteOS Studio结合STM32CubeMX可以快速,高效地进行物联网开发,本文提供一种开发思路及环境的配置方法。...

weixin_45680600的博客 2833

别再傻傻分不清了!Anaconda和Miniconda到底选哪个?附保姆级安装与镜像源配置(Windows/Mac)

本文详细解析了Anaconda和Miniconda的核心差异,包括体积、预装内容、系统资源占用等关键维度,并提供了针对不同需求的决策框架。附有Windows和Mac双平台的详细安装与配置指南,帮助用户根据实际需求选择最适合的conda工具,提升开发效率。

weixin_30315723的博客 426

YII2将文件上传至七牛云指定目录/文件夹内

YII2将文件上传至七牛云指定目录/文件夹内,yii2 composer安装及使用七牛云文件上传

G佳伟 837

手机拍照背后的隐形功臣:一文读懂高通ISP三兄弟(IFE/BPS/IPE)如何协同工作

本文深入解析了高通ISP三兄弟(IFE/BPS/IPE)在手机拍照中的协同工作机制。通过拟人化比喻,详细介绍了IFE作为图像前端引擎的分流预处理、BPS作为RAW格式修图师的专业处理,以及IPE作为全能后期制作人的多面功能,揭示了三者在图像处理pipeline中的高效配合与技术创新。

weixin_27032989的博客 528

前端如何上传图片到七牛云

From: https://www.jianshu.com/p/7520e0bee777 前端如何上传图片到七牛云 流程: 生成token => token和图片作为new FromData() 参数 再上传 token const accessKey = 'TSlScX_akS5TIpsXlkq*****7Efk-ZaZeg4ZWtta'; const secretKe...

weixin_30369041的博客 3494

手把手教你学veriolg(二十六)-- Verilog CIC 滤波器设计

目录 Verilog CIC 滤波器设计1. CIC 滤波器的基本原理2. Verilog 实现3. 说明4. 测试激励5. 总结 CIC(Cascade-Integrator-Comb)滤波器是一种特殊的数字滤波器,常用于多速率信号处理中,尤其是用于信号的上采样(插值)和下采样(抽取)。CIC 滤波器的特点在于它具有简单的硬件实现、不需要乘法器(仅使用加法器和延迟元件)、且具有线性相位特性。然而,CIC 滤波器的缺点是它会产生较大的量化误差,因此在设计时需要特别注意字长的选择以避免溢出。1. CIC 滤波

MHD0815的博客 890

STM32(HAL库)驱动OLED

通过STM32F103C8T6单片机采用HAL库方式对0.96寸OLED(IIC通讯)屏幕进行驱动。

weixin_44597885的博客 8800

七牛云文件上传和文件管理

七牛云文件上传和文件管理 七牛云官网教程:https://developer.qiniu.com/kodo/sdk/1239/java 项目github地址:https://github.com/lx972/qiniu-test 1 上传 上传有两种方式 (1)服务端直传:服务端直传是指客户利用七牛服务端SDK从服务端直接上传文件到七牛云,交互的双方一般都在机房里面,所以服务端可以自己生成上传凭证,然后利用SDK中的上传逻辑进行上传,最后从七牛云获取上传的结果,这个过程中由于双方都是业务服务器,所以很少利用

qq_33012981的博客 4417

2026.3.28:langgraph使用mysql进行持久化会话存储(短期记忆和长期记忆)

本文介绍了如何使用MySQL持久化存储LangGraph会话数据(短期和长期记忆)。首先安装必要的依赖包,然后通过Python代码实现将短期记忆写入MySQL数据库。主要步骤包括:1) 建立MySQL连接;2) 创建代理(agent)并配置检查点(checkpointer)和存储(store);3) 实现工具函数如计算器和天气查询;4) 使用中间件跟踪工具和模型调用次数。最后展示了如何从MySQL读取短期记忆数据,完成会话的持久化存储和检索功能。代码示例包含完整的实现细节,包括状态管理、消息处理和数据库操作

拥抱具身智能,昇腾Ascend C 735

七牛云图片、文件上传

此工具类根据上传日期拼接文件夹,根据UUID生成文件名并拼接上传文件的后缀。注册七牛云的步骤此处不再赘述。此处访问控制建议公开,因为之后图片上传后没有公开是无法访问的!首次会开通OSS、跟着操作步骤一步步走即可。此处考虑到文件重名会导致覆盖问题,引入工具类。开通后此处会有一个测试域名,等会会用到。找到文件上传,此处我们使用数据流上传。将代码拷贝到咱们的测试文件中进行测试。bucket 是你创建的空间名称。选择名称、存储区域、设置访问控制。此处的ak、sk在秘钥管理。右上角打开开发者中心。

qq_37276543的博客 2532

【OpenClaw从入门到精通】第63篇:A股智能分析实战——用OpenClaw搭建个人量化研究助手(2026实测版)

2026年,OpenClaw已成为量化投研圈的现象级工具,八家头部券商密集发布专题研报力证其价值。传统量化投研面临技术门槛高、重复劳动多、策略迭代慢、非结构化数据处理弱四大痛点,而OpenClaw通过“AI智能体+金融Skill+量化API”的融合,实现了从数据获取、策略生成、回测验证到持仓监控的全流程自动化。本文基于2026年最新实测经验,完整呈现个人量化研究助手搭建:从阿里云部署、阿里云百炼API配置(含解析失败解决方案)、Tushare数据源接入,到PB-ROE价值选股、研报复现、自动化回测、持仓监控

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1059

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SpringBoot(24) 整合七牛云实现文件上传

一、前言 本文将基于springboot2.1.8.RELEASE整合七牛云实现文件上传 本文参考 https://www.keppel.fun/articles/2019/02/27/1551262881214.html 二、准备(AccessKey、SecretKey、对象储存空间名称、存储区域、访问域名) 1、先到七牛云官网获取AccessKey/SecretKey 温馨小提示:没有账...

郑清 5569

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

文件上传——七牛云

目录七牛云简介七牛云使用前使用七牛云SDK开发开发步骤开发接口测试源码下载 七牛云简介 七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化PaaS服务。围绕富媒体场景,七牛先后推出了对象存储,融合CDN加速,数据通用处理,内容反垃圾服务,以及直播云服务等。 七牛云对象存储 Kodo 是七牛云提供的高可靠、强安全、低成本、可扩展的存储服务。您可通过控制台、API、SDK 等方式简单快速地接入七牛存储服务,实现海量数据的存储和管理。通过 Kodo 可以进行文件的上传、下载和管理。 总的来说:七

不愿意做鱼的小鲸鱼の博客 1048

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Spring Boot配合七牛云实现文件上传

Spring Boot配合七牛云实现文件上传

qq_45607971的博客 1363

七牛云的文件上传与删除 基于springboot

七牛云的文件上传与删除 基于springboot 话不多说直接上代码: maven依赖 <!-- 七牛云 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.31</version&g

qq_45243872的博客 1195

七牛云 OSS 文件上传demo

OSS的英文全称是Object Storage Service,翻译成中文就是对象存储服务。OSS非常适合存储静态资源,提供HTTP链接的方式来访问到静态资源,例如图片,减轻业务服务器存储静态文件的压力。这里选择七牛云 对象存储服务来实现OSS功能。

大头皮鞋的博客 2095

使用七牛云进行文件上传以及文件删除

3、查看个人秘钥,注册完成账号后,会有一个秘钥,上传文件的时候进行授权和认证。2、在里面创建空间,一个空间相当于一个文件夹,就是将对象上传到的地方。1、注册七牛云账号,完成后选择对象存储。进入七牛云开发者中心。

m0_68041576的博客 1660

Java工具集-七牛云文件上传工具

添加依赖 <!--七牛云--> <dependency> <groupId>com.qiniu</groupId> <artifactId>qiniu-java-sdk</artifactId> <version>...

逍遥云恋 672
上一篇: 环信android sdk接入的过程
下一篇: MediaMetadataRetriever小试牛刀
和小胖
博客等级 码龄12年 8粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值