java实现上传网络图片到七牛云存储

大家好,我是雄雄。

在这里插入图片描述

前言

最近阳了,第二条杠红的发紫,真难受啊,但是吧,博客上有个bug,不解决感觉比阳了还难受。

话还是要从博客的图片显示不出来这里说起,当时做的时候,在发文章这里,感觉没有封面的话,文章会很孤单,所以就设计了个封面这块儿。但是,封面如果太邋遢也还不如没有。

所以我就从网上的一个接口里面随机取的一些精美图片,本来好好的,结果今天一看,那个接口报错403了,当时就想着,这样做太依赖别人了,什么东西都得掌控在自己手里,不然出问题了难受的还是自己。

正好借这个机会,就重新设计了下,先从接口中取,如果接口中的图片能看,则用这个图片,顺便将这个图片传至七牛云存储中,否则就随机从七牛云存储中指定些图片展示出来,这样就不会受制于人。

效果图

在这里插入图片描述
直接将图片传至七牛云中,给我们返回该图片的地址。

代码实现

因为七牛云上传图片的时候,传递的是MultipartFile类型,所以我们需要将网络图片utl转换成流,然后在转换成MultipartFile,接着使用七牛云提供的方法上传即可。

下面我们先看看怎么将网络url转换成MultipartFile,这个代码网上很多,大家可以随便搜一个放上来就行,我这边封装了个工具类:FilesUtil

package com.shiyi.util;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import org.apache.http.entity.ContentType;
import org.apache.pdfbox.io.IOUtils;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;/*** @author: muxiongxiong* @date: 2022年12月29日 15:35* 博客:https://blog.csdn.net/qq_34137397* 个人站:https://www.穆雄雄.com* 个人站:https://www.muxiongxiong.cn* @Description: 类的描述*/
public class FilesUtil {/*** 根据地址获得数据的输入流** @param strUrl 网络连接地址* @return url的输入流*/public static InputStream getInputStreamByUrl(String strUrl) {HttpURLConnection conn = null;try {URL url = new URL(strUrl);conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setConnectTimeout(20 * 1000);final ByteArrayOutputStream output = new ByteArrayOutputStream();IOUtils.copy(conn.getInputStream(), output);return new ByteArrayInputStream(output.toByteArray());} catch (Exception e) {e.printStackTrace();} finally {try {if (conn != null) {conn.disconnect();}} catch (Exception e) {e.printStackTrace();}}return null;}/*** 将网络地址转换成MultipartFile* @param strUrl* @return*/public static MultipartFile onlineAddressTransferFile(String strUrl){MultipartFile file = null;try {String fileName = strUrl.substring(strUrl.lastIndexOf("/") + 1);InputStream  stream = getInputStreamByUrl(strUrl);if (!ObjectUtils.isEmpty(stream)) {file = new MockMultipartFile(fileName, fileName, "", stream);return file;}}catch (Exception exception){exception.printStackTrace();}return file;}}

在调用的时候我们这样调:

  /*** 手动上传网络图片*/@GetMapping(value = "/uploadFm")public ResponseResult uploadFm(){MultipartFile multipartFile =  FilesUtil.onlineAddressTransferFile("https://img-community.csdnimg.cn/images/86f32eac875e42af9ed9e91b809dc7d8.png");return cloudOssService.upload(multipartFile);}

剩下的就是七牛云里面的方法了,这边一起放上来吧:
CloudOssService接口代码:

package com.shiyi.service;import com.shiyi.common.ResponseResult;
import org.springframework.web.multipart.MultipartFile;public interface CloudOssService {/*** 上传* @param file 文件* @return*/ResponseResult upload(MultipartFile file);/*** 批量删除文件* @param key 文件名* @return*/ResponseResult delBatchFile(String ...key);
}

CloudOssServiceImpl实现类,主要是实现CloudOssService接口的:

package com.shiyi.service.impl;import com.shiyi.common.ResponseResult;import com.shiyi.enums.FileUploadModelEnum;
import com.shiyi.service.CloudOssService;
import com.shiyi.service.SystemConfigService;
import com.shiyi.strategy.context.FileUploadStrategyContext;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.util.Objects;@Service
@RequiredArgsConstructor
public class CloudOssServiceImpl implements CloudOssService {private final SystemConfigService systemConfigService;private final FileUploadStrategyContext fileUploadStrategyContext;private String strategy;/*** 上传文件* @param file* @return*/@Overridepublic ResponseResult upload(MultipartFile file) {if (file.getSize() > 1024 * 1024 * 10) {return ResponseResult.error("文件大小不能大于10M");}//获取文件后缀String suffix = Objects.requireNonNull(file.getOriginalFilename()).substring(file.getOriginalFilename().lastIndexOf(".") + 1);if (!"jpg,jpeg,gif,png".toUpperCase().contains(suffix.toUpperCase())) {return ResponseResult.error("请选择jpg,jpeg,gif,png格式的图片");}getFileUploadWay();String key = fileUploadStrategyContext.executeFileUploadStrategy(strategy, file, suffix);return ResponseResult.success(key);}/*** 删除文件* @param key* @return*/@Overridepublic ResponseResult delBatchFile(String ...key) {getFileUploadWay();Boolean isSuccess = fileUploadStrategyContext.executeDeleteFileStrategy(strategy, key);if (!isSuccess) {return ResponseResult.error("删除文件失败");}return ResponseResult.success();}private void getFileUploadWay() {strategy = FileUploadModelEnum.getStrategy(systemConfigService.getCustomizeOne().getFileUploadWay());}
}

最后是文件上传策略上下文类:

package com.shiyi.strategy.context;import com.shiyi.strategy.FileUploadStrategy;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.util.Map;/*** @apiNote 文件上传策略上下文*/
@Service
@RequiredArgsConstructor
public class FileUploadStrategyContext {private final Map<String, FileUploadStrategy> fileUploadStrategyMap;/*** 执行文件上传策略** @param file 文件对象* @return {@link String} 文件名*/public String executeFileUploadStrategy(String fileUploadMode, MultipartFile file,String suffix) {return fileUploadStrategyMap.get(fileUploadMode).fileUpload(file,suffix);}/*** 删除文件策略* @param fileUploadMode* @param key* @return*/public Boolean executeDeleteFileStrategy(String fileUploadMode,String ...key) {return fileUploadStrategyMap.get(fileUploadMode).deleteFile(key);}
}

QiNiuUploadStrategyImpl实现类的代码:

package com.shiyi.strategy.imp;import com.alibaba.fastjson.JSON;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.BatchStatus;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.storage.model.FileInfo;
import com.qiniu.util.Auth;
import com.shiyi.entity.SystemConfig;
import com.shiyi.enums.QiNiuAreaEnum;
import com.shiyi.service.SystemConfigService;
import com.shiyi.strategy.FileUploadStrategy;
import com.shiyi.util.UUIDUtils;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.PostConstruct;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;@Service("qiNiuUploadStrategyImpl")
@RequiredArgsConstructor
public class QiNiuUploadStrategyImpl implements FileUploadStrategy {private final Logger logger = LoggerFactory.getLogger(QiNiuUploadStrategyImpl.class);private final SystemConfigService systemConfigService;private String qi_niu_accessKey;private String qi_niu_secretKey;private String qi_niu_bucket;private Region region;private String qi_niu_url;@PostConstructprivate void init(){SystemConfig systemConfig = systemConfigService.getCustomizeOne();qi_niu_accessKey = systemConfig.getQiNiuAccessKey();qi_niu_secretKey = systemConfig.getQiNiuSecretKey();qi_niu_bucket = systemConfig.getQiNiuBucket();qi_niu_url = systemConfig.getQiNiuPictureBaseUrl();region = QiNiuAreaEnum.getRegion(systemConfig.getQiNiuArea());}public void list() {Configuration configuration = new Configuration(region);Auth auth = Auth.create(qi_niu_accessKey, qi_niu_secretKey);BucketManager bucketManager = new BucketManager(auth,configuration);BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(qi_niu_bucket, null, 1000, null);while (fileListIterator.hasNext()) {FileInfo[] next = fileListIterator.next();for (FileInfo fileInfo : next) {logger.info("文件打印开始,文件名:{}",qi_niu_url + fileInfo.key);logger.info("文件类别打印开始,类别:{}",fileInfo.mimeType);logger.info("文件大小打印开始,大小:{}",fileInfo.fsize);}}}/*** 七牛云文件上传* @param file 文件* @param suffix 后缀* @return*/@Overridepublic String fileUpload(MultipartFile file,String suffix) {String key = null;//构造一个带指定 Region 对象的配置类Configuration cfg = new Configuration(region);//...其他参数参考类注释UploadManager uploadManager = new UploadManager(cfg);//...生成上传凭证,然后准备上传Auth auth = Auth.create(qi_niu_accessKey, qi_niu_secretKey);String upToken = auth.uploadToken(qi_niu_bucket);InputStream inputStream = null;try {inputStream = file.getInputStream();//这里需要处理一下,不能让每次上去都是个UUID的文件名Response response = uploadManager.put(inputStream, "blog/"+UUIDUtils.getUuid() + "." + suffix, upToken,null,null);//解析上传成功的结果DefaultPutRet putRet = JSON.parseObject(response.bodyString(),DefaultPutRet.class);key =  qi_niu_url + putRet.key;} catch (QiniuException ex) {Response r = ex.response;logger.error("QiniuException:{}",r.toString());} catch (IOException e) {e.printStackTrace();}finally {if (inputStream != null){try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}}return key;}/*** 批量删除文件* @return*/@Overridepublic Boolean deleteFile(String ...keys) {//构造一个带指定 Region 对象的配置类Configuration cfg = new Configuration(Region.region2());//...其他参数参考类注释Auth auth = Auth.create(qi_niu_accessKey, qi_niu_secretKey);BucketManager bucketManager = new BucketManager(auth, cfg);try {BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations();batchOperations.addDeleteOp(qi_niu_bucket, keys);Response response = bucketManager.batch(batchOperations);BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class);for (int i = 0; i < keys.length; i++) {BatchStatus status = batchStatusList[i];String key = keys[i];System.out.print(key + "\t");if (status.code == 200) {System.out.println("delete success");} else {System.out.println(status.data.error);}}return true;} catch (QiniuException ex) {System.err.println(ex.response.toString());return false;}}}

然后我们从接口里面直接调用即可上传上去。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gRPC官方快速上手学习笔记(c#版)

上手前准备工作 支持操作系统&#xff1a;windows、OS X、Linux。实例采用.net、.net core sdk。 The .NET Core SDK command line tools. The .NET framework 4.5 (for OS X and Linux, the open source .NET Framework implementation, “Mono”, at version 4, is suitable…

spring cloud+dotnet core搭建微服务架构:Api网关(三)

前言 国庆假期&#xff0c;一直没有时间更新。 根据群里面的同学的提问&#xff0c;强烈推荐大家先熟悉下spring cloud。文章下面有纯洁大神的spring cloud系列。 上一章最后说了&#xff0c;因为服务是不对外暴露的&#xff0c;所以在外网要访问服务必须通过API网关来完成&…

java实现人脸识别源码【含测试效果图】——前期准备工作及访问提示

注意&#xff1a; 看完之后如有不懂&#xff0c;请看&#xff1a;关于人脸和指纹识别共同交流方案&#xff0c;也可以关注微信公众号&#xff1a;雄雄的小课堂&#xff0c;回复&#xff1a;人脸识别群获取群号&#xff0c;群内有直接可以运行的源码可供下载&#xff0c;人脸识…

JS原型链与instanceof底层原理

转载自 JS原型链与instanceof底层原理 一、问题&#xff1a; instanceof 可以判断一个引用是否属于某构造函数&#xff1b; 另外&#xff0c;还可以在继承关系中用来判断一个实例是否属于它的父类型。 老师说&#xff1a;instanceof的判断逻辑是&#xff1a; 从当前引用的…

正则之注册登录

不久前写了个登录注册的网站&#xff0c;因为未对其做出限制&#xff0c;所以&#xff0c;随便你输入什么都可以注册成功&#xff0c;遂想怎么通过js规定注册的账号 我的要求是&#xff1a; 一&#xff1a;输入框不能为空&#xff0c;不能太长也不能太短 二&#xff1a; 1、注…

猿创征文|从酒店前台收银到软件研发教学主管到技术经理之路~

大家好&#xff0c;我是雄雄。 内容先知&#x1f449;前言☝酒店收银&#x1f928;项目组长&#x1f91c;OA管理系统&#x1f91c;酒店管理系统&#x1f468;‍&#x1f3eb;软件研发讲师&#x1f4cc;学术主管&#x1f468;‍&#x1f4bb;技术经理&#x1f449;项目情况&…

微服务~分布式事务里的最终一致性

本地事务ACID大家应该都知道了&#xff0c;统一提交&#xff0c;失败回滚&#xff0c;严格保证了同一事务内数据的一致性&#xff01;而分布式事务不能实现这种ACID&#xff0c;它只能实现CAP原则里的某两个&#xff0c;CAP也是分布式事务的一个广泛被应用的原型&#xff0c;CA…

JavaFX仿windows文件管理器目录树

一、windows文件管理器目录树 二、代码 /** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/ package cn.util;import imagemanagesystem.…

开源纯C#工控网关+组态软件(三)加入一个新驱动:西门子S7

一、 引子 首先感谢博客园&#xff1a;第一篇文章、第一个开源项目&#xff0c;算是旗开得胜。可以看到&#xff0c;项目大部分流量来自于博客园&#xff0c;码农乐园&#xff0c;名不虚传^^。 园友给了我很多支持&#xff0c;并提出了很好的改进意见。现加入屏幕分辨率自适应…

有没有完全自助的国产化数据库技术?

大家好&#xff0c;我是雄雄。 SPL资料 SPL官网SPL下载SPL源代码 前段时间世界部分地区不断的起冲突&#xff0c;Oracle宣布“暂停在俄罗斯的所有业务”&#xff0c;相信大家的心情绝不是隔岸观火&#xff0c;而是细思恐极。 数据库号称IT领域三大核心之一&#xff08;其他两…

我为啥不看好ServiceMesh

转载自 我为啥不看好ServiceMesh 前言 今年&#xff0c;ServiceMesh(服务网格)概念在社区里头非常火&#xff0c;有人提出2018年是ServiceMesh年&#xff0c;还有人提出ServiceMesh是下一代的微服务架构基础。作为架构师&#xff0c;如果你现在还不了解ServiceMesh的话&…

ASP.NET Core 2.0 支付宝当面付之扫码支付

前言 自从微软更换了CEO以后&#xff0c;微软的战略方向有了相当大的变化&#xff0c;不再是那么封闭&#xff0c;开源了许多东西&#xff0c;拥抱开源社区&#xff0c;.NET实现跨平台&#xff0c;收购xamarin并免费提供给开发者等等。我本人是很喜欢.net的&#xff0c;并希望.…

Git使用教程:最详细、最傻瓜、最浅显、真正手把手教

转载自 Git使用教程&#xff1a;最详细、最傻瓜、最浅显、真正手把手教 一&#xff1a;Git是什么&#xff1f; Git是目前世界上最先进的分布式版本控制系统。 工作原理 / 流程&#xff1a; Workspace&#xff1a;工作区 Index / Stage&#xff1a;暂存区 Repository&…

【git】如何在github上推送并部署自己的项目

口令快捷 git add . git commit --m "XXXX" git remote add origin https://github.com/lifeload/new-problem.git git push -f origin master修改或删除文件 git add 对应文件/. git commit -m “xxx” git push origin master 1、上传代码 2、设置&#xff0c;建立…

一起聊聊Microsoft.Extensions.DependencyInjection

Microsoft.Extensions.DependencyInjection在github上同样是开源的&#xff0c;它在dotnetcore里被广泛的使用&#xff0c;比起之前的autofac,unity来说&#xff0c;它可以说是个包裹&#xff0c;或者叫适配器&#xff0c;它自己提供了默认的DI实现&#xff0c;同时也支持第三方…

【git】如何给github绑定ssh

首先在git上输入 &#xff1a; ssh-keygen 会在c盘的用户账号的文件夹.ssh上生成两个密钥 &#xff08;如果没有生成&#xff0c;请注意自己是否按了enter&#xff0c;出现一个小方框为止&#xff09; 将.pug用笔记本打开 全选复制 来到github的设置上 将刚刚复制的东西黏…

【杭州】Hack for Cloud Beginner微软黑客松大赛

在这美丽的西子湖畔&#xff0c;我们欢迎各行各业的开发者参与此次Hack for Cloud Beginner微软黑客松大赛。我们致力于为开发者们提供在技术、社区领域中的交流平台&#xff0c;重在参与&#xff0c;意于创新。 此次黑客松大赛将于10月22日在中国杭州拉开帷幕&#xff0c;参与…

Java高级开发必会的50个性能优化的细节(珍藏版)

转载自 Java高级开发必会的50个性能优化的细节&#xff08;珍藏版&#xff09; 在JAVA程序中&#xff0c;性能问题的大部分原因并不在于JAVA语言&#xff0c;而是程序本身。养成良好的编码习惯非常重要&#xff0c;能够显著地提升程序性能。 ● 1. 尽量在合适的场合使用单例…

从0部署一个动态网站

准备&#xff1a;购买域名和服务器 下载软件&#xff1a;服务器上下载宝塔面板和xampp 首先区分动态网站和静态网站区别&#xff1a;动态网站是指数据可以交互的&#xff0c;根据不同的人出现不同的页面&#xff0c;要用到数据库和php。登录注册是动态网站最基础的部分 而静态…

最新的.NET Framework聚焦于改进可访问性

Microsoft宣布预发布.NET Framework 4.7.1&#xff0c;其中包括了各种全面的改进。这里&#xff0c;我们关注一下在WPF应用可访问性上所做的改进。改进的设想针对领域是屏幕报读器&#xff08;Screen Reader&#xff09;和高对比度场景。Microsoft的Preeti Krishna表示&#xf…