springboot将图片上传至七牛云服务器(超详细)

2023-10-31

我们在公司的业务开发中,经常会接触到图片上传功能,有很多小伙伴都会在这里遇坑,特别是将图片上传至七牛云服务器上,网上的很多讲解也都很不明确。那么今天我们就要来讲一讲如何将本地的图片上传至七牛云服务器上,配合步骤自己做一个小的demo吧!本文章很适合新手入门学习哦!

一.注册七牛云账号

首先我们需要申请一个七牛云账号,登录七牛云网站进行注册,注册成功后登录并进入管理控制台
在这里插入图片描述
进入控制台后点击左边的对象存储
在这里插入图片描述
点击进入后我们新建一个储存空间,具体的步骤就不多做赘述了,新建空间完成后,七牛云会给我们一个测试用的域名,只有30天的有效时间,30天后自动失效。
在这里插入图片描述
到这里为止,七牛云方面就准备完毕了,不过页面先不要关,一会我们在配置信息时还需要使用里面的一些东西。

二.springboot整合七牛云sdk

项目方面我们使用的是当今比较流行的springboot搭建,springboot项目还不熟悉的小伙伴可以先去补习一下,非常简单,如果有需要也可以留言,我会写一篇springboot项目搭建的过程,此文章就不多赘述了,直接开始项目。
首先,我们复制七牛云的相关maven依赖到pom.xml中。


        <!--七牛配置依赖-->
        <!-- 七牛云 -->
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>[7.2.0, 7.2.99]</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.3.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.6.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>happy-dns-java</artifactId>
            <version>0.1.4</version>
            <scope>compile</scope>
        </dependency>

然后我们在项目配置文件中编写我们七牛云的配置,我这里使用的是application.yml,使用application.properties的请自行调整,具体看图
在这里插入图片描述
这里重点来了,说一下里面的配置内容,首先accessKey和secreKey这两个内容可以在我们的七牛云账号中找到,路径为七牛云个人中心-》密钥管理。将里面的两个内容分别复制进去。


# 七牛云配置
# bucket是创建的存储空间名
# path对应存储空间的访问域名
qiniu:
  accessKey:
  secretKey: 
  bucket: 
  path: 

baseUploadUrl: d://temp/

在这里插入图片描述
然后配置文件中的bucket就是我们最初创建的空间名,path就是我们的测试域名,分别复制进去就好了。
接下来我们做一下七牛云的上传配置,在项目下新建conf目录,并新建FileUploadConfig类,将以下代码复制进去

package com.cpj.conf;

import com.google.gson.Gson;
import com.qiniu.common.Zone;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.web.servlet.MultipartProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.support.StandardServletMultipartResolver;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.MultipartConfigElement;
import javax.servlet.Servlet;
import java.io.File;

@Configuration
@ConditionalOnClass({Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class})
@ConditionalOnProperty(prefix = "spring.http.multipart", name = "enabled", matchIfMissing = true)
@EnableConfigurationProperties(MultipartProperties.class)
public class FileUploadConfig {


    private final MultipartProperties multipartProperties;

    @Value("${baseUploadUrl}")
    private String baseUploadUrl;

    @Value("${qiniu.accessKey}")
    private String accessKey;

    @Value("${qiniu.secretKey}")
    private String secretKey;

    public FileUploadConfig(MultipartProperties multipartProperties) {
        this.multipartProperties = multipartProperties;
    }

    /**
     * 上传配置
     */
    @Bean
    @ConditionalOnMissingBean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        judge(baseUploadUrl);
        factory.setLocation(baseUploadUrl);
        return factory.createMultipartConfig();
    }

    public void judge(String filePath){
        File file = new File(filePath);
        if(!file.exists()){
            file.mkdir();
        }
    }

    /**
     * 注册解析器
     */
    @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
    @ConditionalOnMissingBean(MultipartResolver.class)
    public StandardServletMultipartResolver multipartResolver() {
        StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
        multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
        return multipartResolver;
    }

    /**
     * 华东机房
     */
    @Bean
    public com.qiniu.storage.Configuration qiniuConfig() {
        return new com.qiniu.storage.Configuration(Zone.zone0());
    }

    /**
     * 构建一个七牛上传工具实例
     */
    @Bean
    public UploadManager uploadManager() {
        return new UploadManager(qiniuConfig());
    }


    /**
     * 认证信息实例
     *
     * @return
     */
    @Bean
    public Auth auth() {
        return Auth.create(accessKey, secretKey);
    }

    /**
     * 构建七牛空间管理实例
     */
    @Bean
    public BucketManager bucketManager() {
        return new BucketManager(auth(), qiniuConfig());
    }

    /**
     * 配置gson为json解析工具
     *
     * @return
     */
    @Bean
    public Gson gson() {
        return new Gson();
    }
}

baseUploadUrl是我自定义的本地文件路径,七牛云在图片上传时会在本地临时存储一个文件,可以自己在配置文件中定义,不需要和我的一样。
如果以上步骤都做完并且没问题的话,那么我们的基本配置就全部准备完成了,下面我们开始service的开发。

三.图片上传开发

首先我们在service目录下新建FileService接口

package com.cpj.service.upload;

import com.qiniu.common.QiniuException;

import java.io.File;
import java.util.Map;

public interface FileService {

    /**
     * @Author : 
     * @Description : //TODO 多文件上传
     * @Date : 10:04 2019/4/3
     * @Param :
     * @return :
     **/
    Map uploadFile(File file) throws QiniuException;

}

并且新建该接口的实现类

package com.cpj.service.upload;

import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * @author :
 * @ClassName :FileServiceImpl
 * @date : 2019/4/3 10:05
 * @description : TODO
 */
@Service
public class FileServiceImpl implements FileService {


    @Autowired
    private UploadManager uploadManager;

    @Autowired
    private Auth auth;


    @Value("${qiniu.bucket}")
    private String bucket;


    private StringMap putPolicy;

    @Override
    public Map uploadFile(File file) throws QiniuException {
        Map map = new HashMap();
        Response response = this.uploadManager.put(file,null,getUploadToken());
        //解析上传的结果
        DefaultPutRet putRet = new Gson().fromJson(response.bodyString(),DefaultPutRet.class);

        String imageName = putRet.hash;
        int retry = 0;
        while(response.needRetry() && retry < 3){
            response = this.uploadManager.put(file,null,getUploadToken());
        }
        map.put("response",response);
        map.put("imgName",imageName);
        return map;
    }



    private String getUploadToken(){
        return this.auth.uploadToken(bucket,null,3600,putPolicy);
    }



}

将以上代码全部复制到自己的项目当中,图片上传的service层就完成了,一点也不复杂,直接看就可以看懂,所以我这里也不多废话了,接下来我们写controller层的代码。

package com.cpj.controller;

import com.cpj.service.upload.FileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * @author :
 * @ClassName :UploadController
 * @date : 2019/4/1 17:47
 * @description : TODO
 */
@RestController
@RequestMapping("/upload")
@Api(tags = "图片上传接口")
public class UploadController {


    @Autowired
    FileService fileService;

    @Value("${baseUploadUrl}")
    private String url;

    @PostMapping(value = "/uploadImg")
    @ApiOperation(value = "单个图片上传到七牛云")
    public Map<String,Object> uploadImg(@RequestParam(value = "file")MultipartFile upfile) throws IOException {
        Map<String,Object> map = new HashMap<>();
        String fileName = upfile.getOriginalFilename();
        File file = new File(url + fileName);
        try{
			//将MulitpartFile文件转化为file文件格式
            upfile.transferTo(file);
            Map response = fileService.uploadFile(file);
            Object imageName = response.get("imgName");
            map.put("url",imageName);
            map.put("state","SUCESS");
        }catch (Exception e){
            e.printStackTrace();
        }
        return map;
    }
}

controller层的代码其实可以封装到service中,但是我这里为了区分作用,就直接写在这里了,map中的url就是我们上传到七牛云之后我们图片的名字,通过我们之前的域名+这个名字就可以进行访问了。
如果都编写完了,我们可以用swagger进行测试看看功能是否正常,swagger的用法这里不多赘述了,感兴趣的小伙伴快去补习补习吧,真的很好用哦。
到此为止所有的上传图片的功能就结束了,不知道这篇文章有没有帮助到你呢?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

springboot将图片上传至七牛云服务器(超详细) 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • minikube安装

    linux下安装minikube 下载minikube sudo curl Lo minikube https storage googleapis com minikube releases latest minikube linux a
  • 1、node.js实现的时钟案例

    目录 1 JavaScript相关知识回顾 1 1JavaScript 1 2浏览器中JavaScript的运行环境 前端运行环境 2 初始Node js 2 1什么是Node js 2 2Node js中JavaScript的运行环境 后
  • 学会怎样使用Jsp 内置标签、jstl标签库及自定义标签

    学习jsp不得不学习jsp标签 一般来说 对于一个jsp开发者 可以理解为jsp页面中出现的java代码越少 对jsp的掌握就越好 而替换掉java代码的重要方式就是使用jsp标签 jsp标签的分类 1 内置标签 动作标签 不需要在jsp页
  • Matplotlib(8)——图片读取,背景绘制等

    获取当前图像gca Get Current Axes 获取当前axes 方法 plt gca kwargs 实例 x np arange 0 2 np pi 0 1 y x 2 fig plt figure plt subplot 211
  • iOS 快速设置Launch Image 启动图片

    Step1 1 点击Image xcassets 进入图片管理 然后右击 弹出 New Launch Image 2 如图 右侧的勾选可以让你选择是否要对ipad 横屏 竖屏 以及低版本的ios系统做支持 这边我选了ios8 0 ios7
  • std::deque、std::queue、std::stack、std::list 内容概要

    deque deque的简介 deque是 double ended queue 的缩写 和vector一样都是STL的容器 deque是双端的 而vector是单端的 deque在接口上和vector非常相似 在许多操作的地方可以直接替换
  • .bat文件闪退,原因及解决

    之前学习mongodb 创建了一个txt文件 内容是 D cd D Program Files MongoDB bin mongod exe dbpath G data db 然后更改文件名称为 bat时 一运行就一闪就没了 后来 用cmd
  • 篇七:二分法查找

    二分查找也称折半查找 Binary Search 它是一种效率较高的查找方法 但是 二分查找要求线性表必须采用顺序存储结构 不宜用于链式结构 而且表中元素按关键字有序排列 解释 所以二分查找的时候一定要是有序的数组 二分法查找适用于数据量较
  • 基于opencv3的本质矩阵(essential matrix)估计算例

    至今opencv3面世快两年了 五一期间抽空看了下新增的几个关于双目视觉标定算法的使用 关于双目的标定有一类方法是基于本质矩阵 Essential matrix 的标定方法 本质方程与基础方程都是刻画双目视觉极几何关系的两个方程 只不过它们
  • 王者荣耀虚拟服务器设置方法,《王者荣耀》操作设置详解

    王者荣耀 操作设置详解 大神团 小风 发布于10 26 近期手游平台有一款名为 王者荣耀 其优质的MOBA体验让无数玩家爱不释手 而其中的操作模式更值得玩家去深究 究竟这款游戏的操作设置有何作用 玩家又该如何利用好操作模式 就一起来看看吧
  • flask无法创建数据库

    今天实操flask连接mysql的 就短短几行代码 弄得头都大 大概没有打代码的天赋吧 当我定义完这个模型类 跑程序 错误一 TypeError column got an unexpected keyword argument prima
  • 实战:windows如何双显示屏独立显示

    现实中 时常看到那些大佬们同时操作多个显示屏 感觉甚是带劲 于是我经过一番摸索 也找到了一条一台电脑两个显示屏独立显示的方法 再此记录一下 希望能帮到有需要的小伙伴 我的操作环境 一台普通笔记本 一个液晶显示屏 前提 你的笔记本或者台式机主
  • python编程:字典的典型应用:二级(多级)菜单,实现户籍省市的多层级选择

    一 编程题目 现实生活中我们经常要用到二级菜单或者多级菜单 下面我们以一个信息系统中关于户籍省市的选择利用字典来实现一个二级菜单 要求以下面的内容来定义二级菜单 广东省 广州市 珠海市 东莞市 惠州市 汕头市 湛江市 河源市 梅州市 湖南省
  • Elasticsearch密码配置(包括集群与单节点)

    ES单节点密码配置 1 修改配置文件 在配置文件中添加如下参数 xpack security enabled true xpack security transport ssl enabled true xpack license self
  • win7新建文本文档快捷键

    由于编者水平有限 文中难免会有错误和疏漏 请各位读者能提出宝贵建议或给予指正 可在博文下评论指出 我会及时改进 在此先感谢各位 本文是自己学习所做笔记 欢迎转载 但请注明出处 http blog csdn NET yijuanxia 环境
  • 快速了解日志概貌,详细解读13种日志模式解析算法

    云智慧 AIOps 社区是由云智慧发起 针对运维业务场景 提供算法 算力 数据集整体的服务体系及智能运维业务场景的解决方案交流社区 该社区致力于传播 AIOps 技术 旨在与各行业客户 用户 研究者和开发者们共同解决智能运维行业技术难题 推
  • 超级入门题:A+B

    这个题没什么好讲的 两个数 一个a 一个b 两数相加不超过int范围 求两数之和 include
  • bilibili老版本_哔哩哔哩5.13.0旧版本下载-bilibili5.13.0旧版本下载v5.13.0旧版本-西西软件下载...

    bilibili5 13 0旧版本是一款bilibili最近推出的up主动态评论的版本的前一款版本 这个版本相比较新版而言减少了up主评论动态显示 对于不少小伙伴来说 bilibili毕竟是一个用来看视频的地方 所以对于文字评论不怎么感冒
  • Java中只有值传递?一篇文章彻底弄懂

    新手上路 记录自己的理解 在C 中 函数传值有两种方式 即值传递和引用传递 而在Java中 只有值传递 即便传递的对象为引用类型 如String 所谓的值传递是指在调用函数时将实参复制一份传递到函数中 这样函数中操作的是实参的副本 不会对实
  • springboot将图片上传至七牛云服务器(超详细)

    我们在公司的业务开发中 经常会接触到图片上传功能 有很多小伙伴都会在这里遇坑 特别是将图片上传至七牛云服务器上 网上的很多讲解也都很不明确 那么今天我们就要来讲一讲如何将本地的图片上传至七牛云服务器上 配合步骤自己做一个小的demo吧 本文