java实现上传网络图片到七牛云存储(代码片段)

穆雄雄 穆雄雄     2023-03-27     578

关键词:

大家好,我是雄雄。

前言

最近阳了,第二条杠红的发紫,真难受啊,但是吧,博客上有个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
     */
    @Override
    public 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
     */
    @Override
    public 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;

    @PostConstruct
    private 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
     */
    @Override
    public 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
     */
    @Override
    public 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);
        ueditor上传图片到七牛云存储(formapi,java)

转:http://my.oschina.net/duoduo3369/blog/174655ueditor上传图片到七牛云存储ueditor结合七牛传图片七牛的试炼开发前的准备与注意事项说明Let‘srock与ueditor结合前的准备工作首先从表单开始生成token建立图片空间生成token上传流程集成ueditor... 查看详情

canvas保存图片到七牛云(代码片段)

...添加到FormData中ajax.send(formData);//上传数据到后端处理代码实现目前没有看到七牛云提供的JSSDK支持上传blob到云上的, 查看详情

微信小程序上传图片及上传到上传到七牛云(代码片段)

微信小程序图片上传功能包含:上传到七牛云、删除图片、查看图片   1.创建子组件tpupload//wxml文件<viewstyle="padding:10px;"><!--图片上传--><viewclass="weui-uploader"><viewclass="img-vweui-uploader__bd">< 查看详情

php表单上传图片到七牛云存储并返回地址……求具体流程~有代码更好

...文档,其他的资料太少了。研究了下API之后,现在已经能实现图片的上传和下载及上传之后的重定向。首先本篇文章实现的功能如下:1.利用表单上传功能,用户可以点击选择文件按钮,选择本地的一个文件,同时设定上传的图... 查看详情

go实战|电商平台图片上传到七牛云(代码片段)

...息2.config3.upload完整代码这一章节中我们介绍如何把图片上传到七牛云,并且返回对应图片的url。因为后续我们的创建的商品,更换头像等等都是把我们的图片上传七牛云存储,再返回对应的url的。1.获取配置信息打开... 查看详情

前端上传图片头像到七牛云格式变成text

参考技术A流程:七牛云后台的对象存储功能,nodejs后台生成七牛云的token,前端利用elementUI/ice的upload组件,文件名和token作为参数请求到七牛云后台。配置已经完成,写接口用的是express,koa同理,主要做法是先接收前端的图片... 查看详情

web上传图片到七牛云服务器(代码片段)

本文通过javaweb的使用,把要上传的图片通过浏览器上传到服务器上面.`文本仅供参考,可能出现很多不合理;`1创建对应的jsp页面:下面是jsp下面的对应的from表单,上传文件用的那么ImgFiles的属性名称,同样你可以使用其他的,或者... 查看详情

java实现七牛云文件或图片上传下载(代码片段)

文章目录一、准备工作1.1.为什么选择七牛云?1.2.七牛云注册二、java操作七牛云对象存储下载2.1.pom.xml引入依赖2.2.上传下载具体代码三、具体业务例子(七牛云做图片服务器--SpringBoot)3.1.pom.xml(此处继承上面的依赖多引入一个)3.2.创... 查看详情

上传base64图片到七牛云前端遇到的坑

介意前端普通引入七牛云SDk上传图片到七牛云需要多个js,所以才有了base64的上传方式,简化操作,(懒。)七牛云官方文档如下https://developer.qiniu.com/kodo/kb/1326/how-to-upload-photos-to-seven-niuyun-base64-code  我们前端理所当然就... 查看详情

thinkphp6上传图片七牛云如何上传文件到七牛云对象储存cos

参考技术AThinkPHP6如何上传图片七牛云,如何上传文件到七牛云对象储存cos,总所周知图片是特别消耗网站带宽的,个人网站将图片上传至七牛云才能显著提升网站的响应速度,手把手交大家如何上配置ThinkPHP6上传文件至七牛云.然后我... 查看详情

七牛云文件上传助手(代码片段)

qiniuyun_upload_tools最近写博客发现经常要上传图片到七牛云上去,每次打开网页登录然后上传感觉很慢,windows也没有一个好的上传工具,于是写了这样的一个工具。效果使用方法下载程序包点击下载解压后直接在config.json文件里面... 查看详情

谁用七牛云设置水印成功了

...对于以图片为主的站点,这样可以节省很大带宽。将图片上传到七牛服务器的重点就是获得上传凭证uploadToken,直接把AccessKey和Secret放到客户端太不安全,容易被反编译。所以需要在服务器端根据AccessKey和Secret动态生成一个uploadT... 查看详情

如何将图片上传到七牛云平台?

参考技术A上一篇文章介绍了“如何将图片上传到Cloudinary云平台?”但是由于Cloudinary的服务器在国外,所以上传和读取图片的速度会很慢,不适合用作生产,因此有必要再介绍一下国内广受欢迎的“七牛”云平台。以及分步骤给... 查看详情

springboot上传文件到七牛云

准备工作mavenpom.xml添加七牛云的sdk依赖<dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.2.27</version></dependency>配置项七牛云上传 查看详情

java向七牛云上传图片的摆动程序(代码片段)

查看详情

文件流数组上传到七牛云

首先要注册七牛云,申请个空间,获得密钥、等东西,引入官方sdk包,然后再开发文档中找到代码copy进去就可以了。因为非常简单,我就直接弄上代码了。1packagecom.qianmo.foru.bean.request;23importcom.qianmo.core.common.CommonRequest;4importorg.hi... 查看详情

vue上传图片到七牛云实用攻略

参考技术Avue一般采用element 的upload上传图片/文件。首先,设定参数参考Element upload 文档其次,如图所示,重点在于domain和qiniuaddr两个参数!   参考七牛云存储图片域名文档然后 上传一定要先获取到七... 查看详情

使用七牛接口实现图片和文件一键上传(代码片段)

...主要介绍使用七牛提供的接口把七牛云作为图床,用Python实现图片上传和文件上传的脚本实现,可以支持按文件夹批量上传。搭建过网站的同学,一定都涉及到图片上传和文件上传的问题,最近为了弄图片资源接触了一下云存储... 查看详情