上传图片到七牛云(前端和后端)

3.七牛云上传后端接口 1.生成七牛云上传token 1.1 参考七牛云SDK # pythonSDK https://developer.qiniu.com/kodo/sdk/1242/python 1.2 在 oauth/urls.py 中添加生成七牛云token的路由 urlpatterns = [ path('qntoken/', views.QNYTokenView.as_view()), # /oauth/qntoken/ ] 1.3 在 oauth/views.py 中添加视图函数 '''获取上传toke 阅读详情

在开发项目的时候,经常会用到上传图片的功能,如果把图片全都存放在项目路径下,会导致项目越来越臃肿,因此可以考虑把图片上传交给第三方处理,此处采用七牛云进行图片存储。

经过测试,通过七牛云获取图片确实比直接通过自己的服务器获取的速度要快得多,赶快去注册七牛云吧。

上传图片的方式有两种:

  1. 通过服务器:将文件传到服务端,由服务端上传到七牛云
    在这里插入图片描述
  2. 通过前端js:将文件由js直接上传到七牛云
    在这里插入图片描述

两种方式都可以完成上传,但是前者还需占用服务端的带宽来上传文件,然后再由服务端上传;而后者仅占用客户端的资源,这样可以减轻服务端的压力。

依赖

<dependency>
	<groupId>com.qiniu</groupId>
	<artifactId>qiniu-java-sdk</artifactId>
	<version>7.1.1</version>
</dependency>

前端上传

《七牛云官方示例》
.
《前端上传说明文档》
.
《qiniu.min.js下载》

步骤:前端通过服务端请求token,然后再通过七牛云提供的接口进行上传,成功后取得hash和key。

html

<html>
<script type="text/javascript" src="js/jquery-3.1.1.min.js"></script>
<script type="text/javascript" src="js/qiniu.min.js"></script>
<script type="text/javascript">

    $(function () {
        $("#upload").on("click", function () {
            var obj = $("#file");
            var fileName = obj.val();		                                           //上传的本地文件绝对路径
            var suffix = fileName.substring(fileName.lastIndexOf("."),fileName.length);//后缀名
            var file = obj.get(0).files[0];	                                           //上传的文件
            var size = file.size > 1024 ? file.size / 1024 > 1024 ? file.size / (1024 * 1024) > 1024 ? (file.size / (1024 * 1024 * 1024)).toFixed(2) + 'GB' : (file.size
                / (1024 * 1024)).toFixed(2) + 'MB' : (file.size
                / 1024).toFixed(2) + 'KB' : (file.size).toFixed(2) + 'B';		   //文件上传大小
            //七牛云上传
            $.ajax({
                type:'post',
                url: "/QiniuUpToken",
                data:{"suffix":suffix},
                dataType:'json',
                success: function(result){
                    if(result.success == 1){
                        var observer = {                         //设置上传过程的监听函数
                            next(result){                        //上传中(result参数带有total字段的 object,包含loaded、total、percent三个属性)
                                Math.floor(result.total.percent);//查看进度[loaded:已上传大小(字节);total:本次上传总大小;percent:当前上传进度(0-100)]
                            },
                            error(err){                          //失败后
                                alert(err.message);
                            },
                            complete(res){                       //成功后
                                // ?imageView2/2/h/100:展示缩略图,不加显示原图
                                // ?vframe/jpg/offset/0/w/480/h/360:用于获取视频截图的后缀,0:秒,w:宽,h:高
                                $("#image").attr("src",result.domain+result.imgUrl+"?imageView2/2/w/400/h/400/q/100");
                            }
                        };
                        var putExtra = {
                            fname: "",                          //原文件名
                            params: {},                         //用来放置自定义变量
                            mimeType: null                      //限制上传文件类型
                        };
                        var config = {
                            region:qiniu.region.z2,             //存储区域(z0:代表华东;z2:代表华南,不写默认自动识别)
                            concurrentRequestLimit:3            //分片上传的并发请求量
                        };
                        var observable = qiniu.upload(file,result.imgUrl,result.token,putExtra,config);
                        var subscription = observable.subscribe(observer);          // 上传开始
                        // 取消上传
                        // subscription.unsubscribe();
                    }else{
                        alert(result.message);                  //获取凭证失败
                    }
                },error:function(){                             //服务器响应失败处理函数
                    alert("服务器繁忙");
                }
            });
        })
    })
</script>
<body>
    <input type="file" name="image" id="file" accept="image/*">
    <input type="button" id="upload" value="upload">
    <img id="image" src="#" alt="">
</body>
</html>

controller

@Controller
public class QiniuUpload {
    // ******的内容需要查看七牛云账号的相关信息
    private static final String accessKey = "******";    //访问秘钥
    private static final String secretKey = "******";    //授权秘钥
    private static final String bucket = "******";       //存储空间名称
    private static final String domain = "******";       //外链域名

    /**
     * 七牛云上传生成凭证
     *
     * @throws Exception
     */
    @RequestMapping("/QiniuUpToken")
    @ResponseBody
    public Map<String, Object> QiniuUpToken(@RequestParam String suffix) throws Exception{
        Map<String, Object> result = new HashMap<String, Object>();
        try {
            //验证七牛云身份是否通过
            Auth auth = Auth.create(accessKey, secretKey);
            //生成凭证
            String upToken = auth.uploadToken(bucket);
            result.put("token", upToken);
            //存入外链默认域名,用于拼接完整的资源外链路径
            result.put("domain", domain);

            // 是否可以上传的图片格式
            /*boolean flag = false;
            String[] imgTypes = new String[]{"jpg","jpeg","bmp","gif","png"};
            for(String fileSuffix : imgTypes) {
                if(suffix.substring(suffix.lastIndexOf(".") + 1).equalsIgnoreCase(fileSuffix)) {
                    flag = true;
                    break;
                }
            }
            if(!flag) {
                throw new Exception("图片:" + suffix + " 上传格式不对!");
            }*/

            //生成实际路径名
            String randomFileName = UUID.randomUUID().toString() + suffix;
            result.put("imgUrl", randomFileName);
            result.put("success", 1);
        } catch (Exception e) {
            result.put("message", "获取凭证失败,"+e.getMessage());
            result.put("success", 0);
        } finally {
            return result;
        }
    }
}

后端上传

七牛云上传文件工具类

import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.qiniu.util.Base64;
import com.qiniu.util.StringMap;
import com.qiniu.util.UrlSafeBase64;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;

/**
 * 七牛云上传文件工具类
 */
public class QiniuCloudUtil {

    // 设置需要操作的账号的AK和SK
    private static final String ACCESS_KEY = "你的ACCESS_KEY";
    private static final String SECRET_KEY = "你的SECRET_KEY";

    // 要上传的空间
    private static final String bucketname = "你的空间名称";

    // 密钥
    private static final Auth auth = Auth.create(ACCESS_KEY, SECRET_KEY);

    private static final String DOMAIN = "你的图片上传路径";

    private static final String style = "自定义的图片样式";

    public static String getUpToken() {        
        return auth.uploadToken(bucketname, null, 3600, new StringMap().put("insertOnly", 1));
    }
    
    // 普通上传
    public static String upload(String filePath, String fileName) throws IOException {
        // 创建上传对象
        UploadManager uploadManager = new UploadManager();
        try {
            // 调用put方法上传
            String token = auth.uploadToken(bucketname);
            if(StringUtils.isEmpty(token)) {
                System.out.println("未获取到token,请重试!");
                return null;
            }
            Response res = uploadManager.put(filePath, fileName, token);
            // 打印返回的信息
            System.out.println(res.bodyString());
            if (res.isOK()) {
                Ret ret = res.jsonToObject(Ret.class);
                //如果不需要对图片进行样式处理,则使用以下方式即可
                //return DOMAIN + ret.key;
                return DOMAIN + ret.key + "?" + style;
            }
        } catch (QiniuException e) {
            Response r = e.response;
            // 请求失败时打印的异常的信息
            System.out.println(r.toString());
            try {
                // 响应的文本信息
                System.out.println(r.bodyString());
            } catch (QiniuException e1) {
                // ignore
            }
        }
        return null;
    }

    //base64方式上传
    public static String put64image(byte[] base64, String key) throws Exception{
        String file64 = Base64.encodeToString(base64, 0);
        Integer len = base64.length;
        
        //华北空间使用 upload-z1.qiniu.com,华南空间使用 upload-z2.qiniu.com,北美空间使用 upload-na0.qiniu.com
        String url = "http://upload.qiniu.com/putb64/" + len + "/key/"+ UrlSafeBase64.encodeToString(key);      

        RequestBody rb = RequestBody.create(null, file64);
        Request request = new Request.Builder()
		        .url(url)
                .addHeader("Content-Type", "application/octet-stream")
                .addHeader("Authorization", "UpToken " + getUpToken())
                .post(rb).build();
        //System.out.println(request.headers());
        OkHttpClient client = new OkHttpClient();
        okhttp3.Response response = client.newCall(request).execute();
        System.out.println(response);
        //如果不需要添加图片样式,使用以下方式
        //return DOMAIN + key;
        return DOMAIN + key + "?" + style;
    }

    // 普通删除(暂未使用以下方法,未测试)
    public static void delete(String key) throws IOException {
        // 实例化一个BucketManager对象
        BucketManager bucketManager = new BucketManager(auth);
        // 此处的33是去掉:http://ongsua0j7.bkt.clouddn.com/,剩下的key就是图片在七牛云的名称
        key = key.substring(33);
        try {
            // 调用delete方法移动文件
            bucketManager.delete(bucketname, key);
        } catch (QiniuException e) {
            // 捕获异常信息
            Response r = e.response;
            System.out.println(r.toString());
        }
    }

    class Ret {
        public long fsize;
        public String key;
        public String hash;
        public int width;
        public int height;
    }
}

controller

@ResponseBody
@RequestMapping(value="/uploadImg", method=RequestMethod.POST)
public ResultInfo uploadImg(@RequestParam MultipartFile image, HttpServletRequest request) {
    ResultInfo result = new ResultInfo();
    
    if (image.isEmpty()) {
        result.setCode(400);
        result.setMsg("文件为空,请重新上传");
        return result;
    }

    try {
        byte[] bytes = image.getBytes();
        String imageName = UUID.randomUUID().toString();
        try {
            //使用base64方式上传到七牛云
            String url = QiniuCloudUtil.put64image(bytes, imageName);
            result.setCode(200);
            result.setMsg("文件上传成功");
            result.setInfo(url);
        } catch (Exception e) {
            e.printStackTrace();
        }
    } catch (IOException e) {
        result.setCode(500);
        result.setMsg("文件上传发生异常!");
    } finally {
        return result;
    }
}
上传图片到七牛云 5.创建好空间后,就可以编写前后端代码。上传成功的处理,拼接可访问图片的路径,得到路径后就可可以保存到数据库,等待调用,或者直接访问。4.进入个人中心->密钥管理,获取个人的AK和SK,可以先复制到文本上,后面要用。第一步:点击对象存储kodo。3.创建自己的存储空间,2.进入后点击空间管理。前端向后端请求,获取。... 阅读详情

相关推荐

qiniuUpload:七牛云上传助手

七牛云图片上传 使用 bootstarp 文件上传学习, 已经打包好 可以在下载 此分支是私有化定制的上传工具,如果要使用修改配置文件, 做这个东西的原因很简单,就是自己平时写博客的时候用七牛云作为图床,每次上传完图片再去一个一个去找外链太麻烦,而且发现如果使用私有空间,在七牛云给的外链有效期很短,所以就想手动撸一个工具出来。 目标是做一个可以随处使用的七牛云文件上传工具,并实时返回私有文件的外链。 但是实际上,最终做出来的东西什么样并不重要,重要的时候自己在做它的过程中学到的东西。 干巴爹! 使用 使用已有的包 下载以后解压缩,配置 qiniu.properties 中的参数; 使用 java -jar 命令运行 jar 包,浏览器访问 修改源码 将项目导入 idea; 修改 core.model.QiNiuAccount 类 执行 gradle - build 打包出 jar 包即可。

七牛云图片上传

调用接口获取到七牛云的token(参数什么都不用传,但是这个后端接口的网址和之前的不一样),这个token上传七牛云需要用到。最后将七牛云返回的数据和七牛云的线上网址拼合起来就是图片的网址。需要axios和qiniu-js的插件 ,然后是上传七牛云的操作。然后将这个图片网址当作参数调用后端接口,后端会将身份信息返回来。

m0_65720832的博客 1092

七牛云JS前台上传文件,后台获取token

一个上传文件的Demo可用于移动端,包含前后端代码,解压直接在后端填写自己的accessKey、secretKey、bucket、domain之即实现客户端直接上传文件到自己的七牛云空间,前后端代码都有,有详细介绍。拿走拿走!

七牛云 vue 图片上传简单解说,js 上传文件图片

首次使用七牛云存储进行项目的图片存储,整了一上午才整明白,这些官方的教程把明白人也给说糊涂了,文档很不规范。七牛云有免费的使用额度,上传是不算流量的,只有资源被访问的时候才产生流量,很合理。对于个人小项目使用来说,很方便,文件系统本身就应该跟业务系统分离。

学习笔记 3850

MIMIC数据库基本信息分析

一、MIMIC数据库中26张表介绍 数据库中一共有26张表,记录患者入院的各种信息,每张表的介绍如下所示。 表格名 信息 admission 患者基本信息,比如性别、种族、语言、宗教、婚姻、入院和出院时间、死亡时间等 callout 提供病人准备从ICU转出或者已经从ICU转出时相关信息 caregivers 记录医护人员信息(ID、类型、附加...

m0_37520426的博客 1万+

创建可视化机房

(3)窗户位置创建好以后需要对窗户的墙面镂空位置进行修补,具体操作为,选中镂空位置的顶点(这里必须是选择一个平面的顶点,不要跨平面选择),实际操作如下图:选择点以后,鼠标右键,选择【从顶点创建边/面】,或者按F键,随后对其他镂空位置进行相同操作;(2)将【物体模式】修改为【编辑模式】,选中-x对应面的所有顶点,移动顶点位置,其他放小调整按照同理,找到选中对应面的所有顶点,移动位置即可;调整动画事件轴上的线,选中关键帧的时间,调整模型的位置或者旋转角度,具体根据插入关键帧菜单选择的项进行模型的相关调整。

SmileBu丿㦌的博客 2063

图片上传七牛云(前端和后端)(转载)

原创地址 在开发项目的时候,经常会用到上传图片的功能,如果把图片全都存放在项目路径下,会导致项目越来越臃肿,因此可以考虑把图片上传交给第三方处理,此处采用七牛云进行图片存储。 经过测试,通过七牛云获取图片确实比直接通过自己的服务器获取的速度要快得多,赶快去注册七牛云吧。 上传图片的方式有两种: 通过服务器,将文件传到服务端,由服务端上传到七牛云 通过前端js,将文件直接上传到七牛云 两种方...

qq_28016751的博客 1693

Shell编程规范及变量

文章目录一.Shell脚本1.1Shell概述1.2Shell脚本 一.Shell脚本 1.1Shell概述 Shell是Linux系统中开机自动加载的一个特殊程序,它将用户输入的指令,转换成Linux内核可以识别的语言,从而让内核执行调用硬件。 Bash是Linux系统中默认使用shell的程序,它位于/bin/bash。 1.2Shell脚本 将需要执行的命令保存到一个文件中,按照顺序执行,它不需要编译,它是解释型的 ...

夏颜的博客 3673

实现Java+Vue上传图片到七牛云和从七牛云删除图片

开发环境 后端: JDK1.8, SpringBoot2.2.2.RELEASE, Maven3.6.3 前端: vue-element-admin4.4.0

Nonevx的博客 1602

Vue中实现word文档渲染、在线编辑、保存

Vue3对word文档进行渲染、编辑、保存。word转成html,html转成word

h18749849699的博客 1328

S4HANA - Cost Elements成本要素

SAP这里面的配置逻辑很像,就是先建一个对象,然后不停给这个对象附加一些属性,给一个账户附加编号范围,附加账户组。所有模块的维度都在这个表里,看下图的GL,CO,COPA,AA,ML的都在ACDOCA里。要把这5个类型和六大要素对应,先得把六大要素和账户类型对应下(以下是个人理解,不知道对错):当然那个C是新来的,我觉得放在资产下面也行,就不画图了。S4的嵌入式分析是在业务逻辑都整套嵌入的情况下,预开发了数据模型,所以它能提供的就不仅是原始数据了,它能提供的是包含所有相关联的上下文的信息数据。

weixin_45689053的博客 2392

python 上传图片到七牛云上

python 七牛云上传图片

weixin_68919548的博客 1069

手把手教你用光耦搭建安全隔离电路:从洗衣机控制板到PLC输入模块实战

本文通过洗衣机控制板驱动高压电机和PLC输入模块采集现场信号两个实战场景,手把手教你使用光耦搭建安全隔离电路。文章详细解析了电路架构、关键器件选型、参数计算、仿真验证及PCB布局避坑技巧,并对比了光耦与数字隔离器的适用场景,帮助电子工程师掌握这门保障系统稳定与安全的必备技能。

h6j7k8l9p0的博客 462

mpvue+vant+node七牛云上传图片

前言 最近在用mpvue写小程序,用到了vant的ui库中的uploader文件上传的组件,官方实例中要自己写后台接口。七牛云提供了两种分别是客户端和服务器请求云端图片路径的方法,以下采用的是客户端发起请求的方法,但是token还是要通过后端接口得到。 图片上传需要经过以下几步: 上传图片,获得事件中wx提供的图片路径 注册七牛云账号 后端通过accessKey和secretKey请求七牛云服...

mrhou的博客 1035

【OpenCV实战】简洁易懂的车牌号识别Python+OpenCV实现“超详解”(含代码)

简洁易懂的车牌号识别Python实现(含代码)1、整体思路2、代码详解 1、整体思路 2、代码详解

qq_40784418的博客 9万+

【WRF模拟】如何查看 WPS 的输入静态地理数据(二进制格式)?

如何查看 WPS 的输入静态地理数据(二进制格式)?

WW、forever的博客 632

一文带你搞定若依Springboot集成七牛云存储(测试:项目中头像上传替换为七牛云存储)

Ruoyi-OBS: Ruoyi+Ruoyi-Vue3集成七牛云。

weixin_59015876的博客 2531

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

前端Vue上传图片到七牛云&后端Django上传图片到七牛云

前言 在开发项目的时候,经常会用到上传图片的功能,如果把图片全都存放在项目路径下,会导致项目越来越臃肿,因此可以考虑把图片上传交给第三方处理,此处采用七牛云进行图片存储。 经过测试,通过七牛云获取图片确实比直接通过自己的服务器获取的速度要快得多,赶快去注册七牛云吧。 上传方式 上传图片的方式有两种: 通过服务器:将文件传到服务端,由服务端上传到七牛云 通过前端JS:将文件直接从JS上传到七牛云。 两种方式都可以完成上传,但是前者还需占用服务端的带宽来上传文件,然后再由服务端上传;而后者仅占用客户端的资

wxina 901

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

七牛云图片上传 前后端全过程

七牛云上传流程概述 后端生成上传凭证:服务器端使用七牛云 SDK 生成上传凭证(uptoken) 前端获取凭证:前端通过 API 向后端请求上传凭证 前端上传图片:前端使用获取的凭证将图片上传到七牛云 处理上传结果:七牛云返回上传结果,前端或后端处理结果

edwardwzw的博客 702

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JS上传图片到七牛云

七牛云 js 实现

qq_19340721的博客 564

七牛云上传图片

以下是我和同学研究出来的,有什么不对的,还望指出! 对于七牛云上传首先我们应该明确一个整体的思路逻辑: 点击上传按钮时,先以字节流的方式将图片上传的云盘,再将对应的图片地址传回数据库进行保存的操作。 先注册七牛云账号 打开个人中心,完成实名注册,记住自己的AK,SK,还有仓库名称,这是生成秘钥的必要步骤 添加依赖 <!--swagger3自动生成接口文档的工具--> <dependency> <

m0_62236182的博客 2426

七牛云上传图片或视频

Vue上传视频或图片到七牛云 先进去七牛云官方文档中 从文档进入开发中中心 找到sdk就可以直接用 2.首先下载七牛云的javascript-SDK npm install qiniu-js 下载完成JavaScript-SDK以后就可以上传图片信息了 <template> <div> <input type="file" name='upFile' id="upFile" @change='changeFile($event)'> &

weixin_51103262的博客 818

JavaScript如何上传文件到七牛云(上传视频显示进度条)

背景 之前在后端上传视频到七牛云上,发现上传速度很慢,后来尝试直接在前端上传视频到七牛云上,最后实测发现快了很多。采用前端上传也减轻了服务器压力。 参考 七牛云存储示例:http://jssdk.demo.qiniu.io/ 官方SDK:https://developer.qiniu.com/kodo/sdk/1283/javascript swf文件下载SDK里面有 下载地址:htt...

Captain_JC的博客 6430

Js上传图片到七牛云(直接上代码)

准备工作:     1.七牛云传图片有多种方式,分为前端上传和后端上传,采用前端上传的最大的好处就是将减轻了服务器压力。     2.由于有些小朋友不想看官网的代码(本人认为官网好多"废话"'),所以本文主要讲解Js上传,app端官网有自己的api。     3.有效的token字符串(七牛云上传必须在七牛云官网购买对应的服务(这里的token主要是后端根据账号和密码生成的token)) ...

ChinaLiu_Kang的博客 8781
上一篇: Java基础之异常(Exception)
下一篇: Mysql的合,交,并,差集
章 鱼
博客等级 码龄10年 203粉丝 105原创
评论 26
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值