上传图片到七牛云并返回图片URL_前端通过url直接获取图片

上传图片到七牛云并返回图片URL_前端通过url直接获取图片在开发项目的时候,经常会用到上传图片的功能,如果把图片全都存放在项目路径下,会导致项目越来越臃肿,因此可以考虑把图片上传交给第三方处理,此处我们采用七牛云进行图片存储。一.七牛云准备工作1.七牛云注册登录https://portal.qiniu.com/signup/choice2.新建存储空间进入对象存储菜单,点击“新建存储空间”,这里需要实名认证,上传身份证正反…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

一.七牛云准备工作

1.七牛云注册登录

https://portal.qiniu.com/signup/choice
这里写图片描述

2.新建存储空间

这里写图片描述

进入对象存储菜单,点击“新建存储空间”,这里需要实名认证,上传身份证正反面之类的,大概一个小时左右就认证成功了,效率真是棒棒哒~

这里写图片描述

这里的存储空间名称要记住,之后在代码里面会用到。

二.代码实现

1.在pom.xml添加七牛云依赖

我的项目使用了maven管理jar包,所以只需直接添加相应依赖即可:

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

2.添加七牛云图片操作工具类

package com.cn.netdisk.util;

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 String getUpToken() {        
        return auth.uploadToken(bucketname, null, 3600, new StringMap().put("insertOnly", 1));
    }
	// 普通上传
	public String upload(String filePath, String fileName) throws IOException {
		// 创建上传对象
		UploadManager uploadManager = new UploadManager();
		try {
			// 调用put方法上传
			String token = auth.uploadToken(bucketname);
			if(UtilValidate.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 String put64image(byte[] base64, String key) throws Exception{
        String file64 = Base64.encodeToString(base64, 0);
        Integer l = base64.length;
        String url = "http://upload.qiniu.com/putb64/" + l + "/key/"+ UrlSafeBase64.encodeToString(key);      
        //非华东空间需要根据注意事项 1 修改上传域名
        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 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;
	}
}

(1).获取需要操作的账号的AK和SK

private static final String ACCESS_KEY = "你的ACCESS_KEY";
private static final String SECRET_KEY = "你的SECRET_KEY";

进入个人中心-密钥管理
这里写图片描述

(2).获取要上传的空间

private static final String bucketname = "你的空间名称";

这里写图片描述

(3).获取图片上传URL路径

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

这里写图片描述
(4).获取自定义的图片样式

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

我这里是需要给图片添加水印,所以自定义了图片样式,如果对于上传图片没有格式要求,则可以跳过此步骤。

这里写图片描述

将imagestyle的处理接口作为style的值即可。

3.后端代码调用

@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();
			
			QiniuCloudUtil qiniuUtil = new QiniuCloudUtil();
            try {
                //使用base64方式上传到七牛云
                String url = qiniuUtil.put64image(bytes, imageName);
                result.setCode(200);
    			result.setMsg("文件上传成功");
    			result.setInfo(url);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
		} catch (IOException e) {
			result.setCode(500);
			result.setMsg("文件上传发生异常!");
			return result;
		}
	}

4.前端代码调用

我使用的是vue,这里是使用了quillEditor富文本编辑器组件进行图片上传,uploadImg是上传图片调用的方法:

uploadImg: async function(id) {  
    var vm = this;
    var fileInput = document.getElementById("uniqueId");  
    var formData = new FormData();
    formData.append("image", fileInput.files[0]);
    this.$axios({
        method: "post",
        url: '/api/article/uploadImg',
        data: formData
    }).then((response) = >{
        if (response.data.code == 200) {
	        //后端返回的url地址
            var url = response.data.info;
            if (url != null && url.length > 0) {   
	            vm.addImgRange = vm.$refs.myQuillEditor.quill.getSelection();
                var index = vm.addImgRange != null ? vm.addImgRange.index: 0;   vm.$refs.myQuillEditor.quill.insertEmbed(index, 'image', url);  
            } else {
              this.$Message.error("图片添加失败!");  
            }
        } else {
            this.$Message.error(response.data.msg);
        }
    });   
}

欢迎关注我的公众号,用讲故事的方式学技术。

这里有脑洞大开的奇葩故事,也有温暖文艺的心灵感悟。

技术知识,也可以很有趣。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190532.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月18日 下午11:22
下一篇 2026年2月19日 上午7:01


相关推荐

  • 2015.7.3, 杭州……产品级敏捷案例研究[通俗易懂]

    2015.7.3, 杭州……产品级敏捷案例研究

    2022年2月4日
    44
  • 时序数据特征提取_时间序列提取一维特征

    时序数据特征提取_时间序列提取一维特征时序数据特征提取时间序列的表示方法分段线性表示分段线性表示符号化聚合近似时间序列的相似性度量方法Minkowski距离动态时间弯曲符号化距离基于模型的距离度量方法时间序列的特征提取方法基于统计特征的分类特征提取基于构建模型的分类特征提取基于变换的分类特征提取基于分形理论的分类特征提取特征提取在提高分类的准确性中起着非常关键的作用.对时序特征提取的方法进行归纳分类,将有利于对特征提取整体性,全面性的认识.回顾现有的时间序列中特征提取的方法,将其总结为四大类,它们分别是基于基本统计方法的特征提取、

    2025年8月13日
    5
  • 瀑布模型&快速原型模型

    瀑布模型&快速原型模型一 瀑布模型 1 1 什么是瀑布模型瀑布模型将软件生命周期划分为软件计划 需求分析 软件设计 程序编码 软件测试 运行维护等基本活动 并且规定了他们自上而下 相互衔接的固定顺序 如同瀑布流水 逐级下落 瀑布模型是最早出现的软件开发模型 在软件工程中占有特别重要的地位 它提供了软件开发的基本框架 其过程是从上一项活动接收该项活动的工作对象作为输入 利用这一输入实施该项活动应完成的内容给出该项活动的工作成果 并作为输出传给下一项活动 对于经常变化的项目而言 瀑布模型毫无价值 1 2 特点 1 阶段间具

    2026年3月18日
    2
  • MySQL截取字符串的方法-substring_index

    MySQL截取字符串的方法-substring_indexsubstring_index的用法substring_index(str,delim,count)str:要处理的字符串delim:分隔符count:计数(要截取的位置,正数为从左向右,负数为从右向左)工作中遇到的案例:排查生产问题的时候,需要从类似下面的日志中取出一个orderId这个字段对应的数字customer_id=87380–>customer_id有最新跟进的订单,orderId=293976–>ENDSQL语句:selectsubstring_ind

    2022年5月16日
    42
  • python和pycharm安装包(附网盘地址)「建议收藏」

    python和pycharm安装包(附网盘地址)「建议收藏」「pycharm-community-2017.3.4.exe」等文件https://www.aliyundrive.com/s/kNz92RwkFTK提取码:dq74点击链接保存,或者复制本段内容,打开「阿里云盘」APP,无需下载极速在线查看,视频原画倍速播放。

    2022年5月13日
    52
  • Java中String转Integer类型

    Java中String转Integer类型很简单 ps 这么简单不能不记住 Integer parseInt 520 Integer valueOf 520 如果是 Object 的话就直接 Objectnum 520 intaa int num nbsp

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号